James Moger
2012-06-08 62cec24d10fe126e3b7651359c10cf8b7bfd6a5d
Updated to Bootstrap 2.0.4. Responsive layout by default.
33 files modified
3849 ■■■■■ changed files
distrib/gitblit.properties 7 ●●●●● patch | view | raw | blame | history
docs/04_releases.mkd 8 ●●●●● patch | view | raw | blame | history
resources/bootstrap/css/bootstrap-responsive.css 563 ●●●●● patch | view | raw | blame | history
resources/bootstrap/css/bootstrap.css 2469 ●●●● patch | view | raw | blame | history
resources/bootstrap/img/glyphicons-halflings-white.png patch | view | raw | blame | history
resources/bootstrap/img/glyphicons-halflings.png patch | view | raw | blame | history
resources/bootstrap/js/bootstrap.js 585 ●●●●● patch | view | raw | blame | history
resources/gitblit.css 21 ●●●● patch | view | raw | blame | history
src/com/gitblit/utils/ActivityUtils.java 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ActivityPage.html 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/BasePage.html 24 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/BasePage.java 9 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/CommitDiffPage.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/CommitPage.html 10 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/CommitPage.java 1 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/LuceneSearchPage.html 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RepositoryPage.html 26 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RepositoryPage.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RootPage.html 10 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/SummaryPage.html 6 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/SummaryPage.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/TreePage.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/ActivityPanel.html 6 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/BranchesPanel.html 6 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/CommitHeaderPanel.html 15 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/CommitHeaderPanel.java 3 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/HistoryPanel.html 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/LinkPanel.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/LogPanel.html 8 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/RepositoriesPanel.html 30 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/RepositoryUrlPanel.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/TagsPanel.html 6 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/UsersPanel.html 8 ●●●● patch | view | raw | blame | history
distrib/gitblit.properties
@@ -295,6 +295,13 @@
# SINCE 0.7.0 
web.enableRpcAdministration = false
# If true, the web ui layout will respond and adapt to the browser's dimensions.
# if false, the web ui will use a 940px fixed-width layout.
# http://twitter.github.com/bootstrap/scaffolding.html#responsive
#
# SINCE 1.0.0
web.useResponsiveLayout = true
# Allow Gravatar images to be displayed in Gitblit pages.
#
# SINCE 0.8.0
docs/04_releases.mkd
@@ -11,11 +11,14 @@
#### changes
- Changed default layout for web ui from fixed-width layout to responsive (issue 101)
- IUserService interface has changed to better accomodate custom authentication and/or custom authorization
- Updated Japanese translation (Github/zakki)
#### additions
- Added setting to control responsive or fixed-width layout (issue 101)
    **New:** *web.useResponsiveLayout = true*
- Added setting to control charsets for blob string decoding.  Default encodings are UTF-8, ISO-8859-1, and server's default charset. (issue 97)  
    **New:** *web.blobEncodings = UTF-8 ISO-8859-1*  
- Exposed JGit's internal configuration settings in gitblit.properties/web.xml (issue 93)  
@@ -32,6 +35,11 @@
- Added script to facilitate proxy environment setup on Linux (Github/mragab)
- Added Spanish translation (Eduardo Guervos Narvaez)
#### dependency changes
- updated to Bootstrap 2.0.4
- added Ivy 2.2.0 (for Grape support in Groovy hook scripts)
**0.9.3** *released 2012-04-11*
#### fixes
resources/bootstrap/css/bootstrap-responsive.css
@@ -1,5 +1,5 @@
/*!
 * Bootstrap Responsive v2.0.2
 * Bootstrap Responsive v2.0.4
 *
 * Copyright 2012 Twitter, Inc
 * Licensed under the Apache License v2.0
@@ -7,85 +7,86 @@
 *
 * Designed and built with all the love in the world @twitter by @mdo and @fat.
 */
.clearfix {
  *zoom: 1;
}
.clearfix:before,
.clearfix:after {
  display: table;
  content: "";
}
.clearfix:after {
  clear: both;
}
.hide-text {
  overflow: hidden;
  text-indent: 100%;
  white-space: nowrap;
  font: 0/0 a;
  color: transparent;
  text-shadow: none;
  background-color: transparent;
  border: 0;
}
.input-block-level {
  display: block;
  width: 100%;
  min-height: 28px;
  /* Make inputs at least the height of their button counterpart */
  /* Makes inputs behave like true block-level elements */
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  -ms-box-sizing: border-box;
  box-sizing: border-box;
     -moz-box-sizing: border-box;
      -ms-box-sizing: border-box;
          box-sizing: border-box;
}
.hidden {
  display: none;
  visibility: hidden;
}
.visible-phone {
  display: none;
  display: none !important;
}
.visible-tablet {
  display: none;
  display: none !important;
}
.visible-desktop {
  display: block;
}
.hidden-phone {
  display: block;
}
.hidden-tablet {
  display: block;
}
.hidden-desktop {
  display: none;
  display: none !important;
}
@media (max-width: 767px) {
  .visible-phone {
    display: block;
    display: inherit !important;
  }
  .hidden-phone {
    display: none;
    display: none !important;
  }
  .hidden-desktop {
    display: block;
    display: inherit !important;
  }
  .visible-desktop {
    display: none;
    display: none !important;
  }
}
@media (min-width: 768px) and (max-width: 979px) {
  .visible-tablet {
    display: block;
    display: inherit !important;
  }
  .hidden-tablet {
    display: none;
    display: none !important;
  }
  .hidden-desktop {
    display: block;
    display: inherit !important;
  }
  .visible-desktop {
    display: none;
    display: none !important ;
  }
}
@media (max-width: 480px) {
  .nav-collapse {
    -webkit-transform: translate3d(0, 0, 0);
@@ -111,14 +112,14 @@
    padding-top: 0;
  }
  .form-horizontal .form-actions {
    padding-left: 10px;
    padding-right: 10px;
    padding-left: 10px;
  }
  .modal {
    position: absolute;
    top: 10px;
    left: 10px;
    right: 10px;
    left: 10px;
    width: auto;
    margin: 0;
  }
@@ -133,14 +134,28 @@
    position: static;
  }
}
@media (max-width: 767px) {
  body {
    padding-left: 20px;
    padding-right: 20px;
    padding-left: 20px;
  }
  .navbar-fixed-top {
    margin-left: -20px;
  .navbar-fixed-top,
  .navbar-fixed-bottom {
    margin-right: -20px;
    margin-left: -20px;
  }
  .container-fluid {
    padding: 0;
  }
  .dl-horizontal dt {
    float: none;
    width: auto;
    clear: none;
    text-align: left;
  }
  .dl-horizontal dd {
    margin-left: 0;
  }
  .container {
    width: auto;
@@ -148,19 +163,20 @@
  .row-fluid {
    width: 100%;
  }
  .row {
  .row,
  .thumbnails {
    margin-left: 0;
  }
  .row > [class*="span"],
  .row-fluid > [class*="span"] {
    float: none;
  [class*="span"],
  .row-fluid [class*="span"] {
    display: block;
    float: none;
    width: auto;
    margin: 0;
    margin-left: 0;
  }
  .thumbnails [class*="span"] {
    width: auto;
  }
  .input-large,
  .input-xlarge,
  .input-xxlarge,
  input[class*="span"],
  select[class*="span"],
  textarea[class*="span"],
@@ -168,20 +184,20 @@
    display: block;
    width: 100%;
    min-height: 28px;
    /* Make inputs at least the height of their button counterpart */
    /* Makes inputs behave like true block-level elements */
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    box-sizing: border-box;
       -moz-box-sizing: border-box;
        -ms-box-sizing: border-box;
            box-sizing: border-box;
  }
  .input-prepend input,
  .input-append input,
  .input-prepend input[class*="span"],
  .input-append input[class*="span"] {
    display: inline-block;
    width: auto;
  }
}
@media (min-width: 768px) and (max-width: 979px) {
  .row {
    margin-left: -20px;
@@ -288,205 +304,136 @@
  .row-fluid:after {
    clear: both;
  }
  .row-fluid > [class*="span"] {
  .row-fluid [class*="span"] {
    display: block;
    float: left;
    width: 100%;
    min-height: 28px;
    margin-left: 2.762430939%;
    *margin-left: 2.709239449638298%;
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
        -ms-box-sizing: border-box;
            box-sizing: border-box;
  }
  .row-fluid > [class*="span"]:first-child {
  .row-fluid [class*="span"]:first-child {
    margin-left: 0;
  }
  .row-fluid > .span12 {
  .row-fluid .span12 {
    width: 99.999999993%;
    *width: 99.9468085036383%;
  }
  .row-fluid > .span11 {
  .row-fluid .span11 {
    width: 91.436464082%;
    *width: 91.38327259263829%;
  }
  .row-fluid > .span10 {
  .row-fluid .span10 {
    width: 82.87292817100001%;
    *width: 82.8197366816383%;
  }
  .row-fluid > .span9 {
  .row-fluid .span9 {
    width: 74.30939226%;
    *width: 74.25620077063829%;
  }
  .row-fluid > .span8 {
  .row-fluid .span8 {
    width: 65.74585634900001%;
    *width: 65.6926648596383%;
  }
  .row-fluid > .span7 {
  .row-fluid .span7 {
    width: 57.182320438000005%;
    *width: 57.129128948638304%;
  }
  .row-fluid > .span6 {
  .row-fluid .span6 {
    width: 48.618784527%;
    *width: 48.5655930376383%;
  }
  .row-fluid > .span5 {
  .row-fluid .span5 {
    width: 40.055248616%;
    *width: 40.0020571266383%;
  }
  .row-fluid > .span4 {
  .row-fluid .span4 {
    width: 31.491712705%;
    *width: 31.4385212156383%;
  }
  .row-fluid > .span3 {
  .row-fluid .span3 {
    width: 22.928176794%;
    *width: 22.874985304638297%;
  }
  .row-fluid > .span2 {
  .row-fluid .span2 {
    width: 14.364640883%;
    *width: 14.311449393638298%;
  }
  .row-fluid > .span1 {
  .row-fluid .span1 {
    width: 5.801104972%;
    *width: 5.747913482638298%;
  }
  input,
  textarea,
  .uneditable-input {
    margin-left: 0;
  }
  input.span12, textarea.span12, .uneditable-input.span12 {
  input.span12,
  textarea.span12,
  .uneditable-input.span12 {
    width: 714px;
  }
  input.span11, textarea.span11, .uneditable-input.span11 {
  input.span11,
  textarea.span11,
  .uneditable-input.span11 {
    width: 652px;
  }
  input.span10, textarea.span10, .uneditable-input.span10 {
  input.span10,
  textarea.span10,
  .uneditable-input.span10 {
    width: 590px;
  }
  input.span9, textarea.span9, .uneditable-input.span9 {
  input.span9,
  textarea.span9,
  .uneditable-input.span9 {
    width: 528px;
  }
  input.span8, textarea.span8, .uneditable-input.span8 {
  input.span8,
  textarea.span8,
  .uneditable-input.span8 {
    width: 466px;
  }
  input.span7, textarea.span7, .uneditable-input.span7 {
  input.span7,
  textarea.span7,
  .uneditable-input.span7 {
    width: 404px;
  }
  input.span6, textarea.span6, .uneditable-input.span6 {
  input.span6,
  textarea.span6,
  .uneditable-input.span6 {
    width: 342px;
  }
  input.span5, textarea.span5, .uneditable-input.span5 {
  input.span5,
  textarea.span5,
  .uneditable-input.span5 {
    width: 280px;
  }
  input.span4, textarea.span4, .uneditable-input.span4 {
  input.span4,
  textarea.span4,
  .uneditable-input.span4 {
    width: 218px;
  }
  input.span3, textarea.span3, .uneditable-input.span3 {
  input.span3,
  textarea.span3,
  .uneditable-input.span3 {
    width: 156px;
  }
  input.span2, textarea.span2, .uneditable-input.span2 {
  input.span2,
  textarea.span2,
  .uneditable-input.span2 {
    width: 94px;
  }
  input.span1, textarea.span1, .uneditable-input.span1 {
  input.span1,
  textarea.span1,
  .uneditable-input.span1 {
    width: 32px;
  }
}
@media (max-width: 979px) {
  body {
    padding-top: 0;
  }
  .navbar-fixed-top {
    position: static;
    margin-bottom: 18px;
  }
  .navbar-fixed-top .navbar-inner {
    padding: 5px;
  }
  .navbar .container {
    width: auto;
    padding: 0;
  }
  .navbar .brand {
    padding-left: 10px;
    padding-right: 10px;
    margin: 0 0 0 -5px;
  }
  .navbar .nav-collapse {
    clear: left;
  }
  .navbar .nav {
    float: none;
    margin: 0 0 9px;
  }
  .navbar .nav > li {
    float: none;
  }
  .navbar .nav > li > a {
    margin-bottom: 2px;
  }
  .navbar .nav > .divider-vertical {
    display: none;
  }
  .navbar .nav .nav-header {
    color: #999999;
    text-shadow: none;
  }
  .navbar .nav > li > a,
  .navbar .dropdown-menu a {
    padding: 6px 15px;
    font-weight: bold;
    color: #999999;
    -webkit-border-radius: 3px;
    -moz-border-radius: 3px;
    border-radius: 3px;
  }
  .navbar .dropdown-menu li + li a {
    margin-bottom: 2px;
  }
  .navbar .nav > li > a:hover,
  .navbar .dropdown-menu a:hover {
    background-color: #222222;
  }
  .navbar .dropdown-menu {
    position: static;
    top: auto;
    left: auto;
    float: none;
    display: block;
    max-width: none;
    margin: 0 15px;
    padding: 0;
    background-color: transparent;
    border: none;
    -webkit-border-radius: 0;
    -moz-border-radius: 0;
    border-radius: 0;
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
  }
  .navbar .dropdown-menu:before,
  .navbar .dropdown-menu:after {
    display: none;
  }
  .navbar .dropdown-menu .divider {
    display: none;
  }
  .navbar-form,
  .navbar-search {
    float: none;
    padding: 9px 15px;
    margin: 9px 0;
    border-top: 1px solid #222222;
    border-bottom: 1px solid #222222;
    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
    -moz-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);
  }
  .navbar .nav.pull-right {
    float: none;
    margin-left: 0;
  }
  .navbar-static .navbar-inner {
    padding-left: 10px;
    padding-right: 10px;
  }
  .btn-navbar {
    display: block;
  }
  .nav-collapse {
    overflow: hidden;
    height: 0;
  }
}
@media (min-width: 980px) {
  .nav-collapse.collapse {
    height: auto !important;
    overflow: visible !important;
  }
}
@media (min-width: 1200px) {
  .row {
    margin-left: -30px;
@@ -593,88 +540,132 @@
  .row-fluid:after {
    clear: both;
  }
  .row-fluid > [class*="span"] {
  .row-fluid [class*="span"] {
    display: block;
    float: left;
    width: 100%;
    min-height: 28px;
    margin-left: 2.564102564%;
    *margin-left: 2.510911074638298%;
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
        -ms-box-sizing: border-box;
            box-sizing: border-box;
  }
  .row-fluid > [class*="span"]:first-child {
  .row-fluid [class*="span"]:first-child {
    margin-left: 0;
  }
  .row-fluid > .span12 {
  .row-fluid .span12 {
    width: 100%;
    *width: 99.94680851063829%;
  }
  .row-fluid > .span11 {
  .row-fluid .span11 {
    width: 91.45299145300001%;
    *width: 91.3997999636383%;
  }
  .row-fluid > .span10 {
  .row-fluid .span10 {
    width: 82.905982906%;
    *width: 82.8527914166383%;
  }
  .row-fluid > .span9 {
  .row-fluid .span9 {
    width: 74.358974359%;
    *width: 74.30578286963829%;
  }
  .row-fluid > .span8 {
  .row-fluid .span8 {
    width: 65.81196581200001%;
    *width: 65.7587743226383%;
  }
  .row-fluid > .span7 {
  .row-fluid .span7 {
    width: 57.264957265%;
    *width: 57.2117657756383%;
  }
  .row-fluid > .span6 {
  .row-fluid .span6 {
    width: 48.717948718%;
    *width: 48.6647572286383%;
  }
  .row-fluid > .span5 {
  .row-fluid .span5 {
    width: 40.170940171000005%;
    *width: 40.117748681638304%;
  }
  .row-fluid > .span4 {
  .row-fluid .span4 {
    width: 31.623931624%;
    *width: 31.5707401346383%;
  }
  .row-fluid > .span3 {
  .row-fluid .span3 {
    width: 23.076923077%;
    *width: 23.0237315876383%;
  }
  .row-fluid > .span2 {
  .row-fluid .span2 {
    width: 14.529914530000001%;
    *width: 14.4767230406383%;
  }
  .row-fluid > .span1 {
  .row-fluid .span1 {
    width: 5.982905983%;
    *width: 5.929714493638298%;
  }
  input,
  textarea,
  .uneditable-input {
    margin-left: 0;
  }
  input.span12, textarea.span12, .uneditable-input.span12 {
  input.span12,
  textarea.span12,
  .uneditable-input.span12 {
    width: 1160px;
  }
  input.span11, textarea.span11, .uneditable-input.span11 {
  input.span11,
  textarea.span11,
  .uneditable-input.span11 {
    width: 1060px;
  }
  input.span10, textarea.span10, .uneditable-input.span10 {
  input.span10,
  textarea.span10,
  .uneditable-input.span10 {
    width: 960px;
  }
  input.span9, textarea.span9, .uneditable-input.span9 {
  input.span9,
  textarea.span9,
  .uneditable-input.span9 {
    width: 860px;
  }
  input.span8, textarea.span8, .uneditable-input.span8 {
  input.span8,
  textarea.span8,
  .uneditable-input.span8 {
    width: 760px;
  }
  input.span7, textarea.span7, .uneditable-input.span7 {
  input.span7,
  textarea.span7,
  .uneditable-input.span7 {
    width: 660px;
  }
  input.span6, textarea.span6, .uneditable-input.span6 {
  input.span6,
  textarea.span6,
  .uneditable-input.span6 {
    width: 560px;
  }
  input.span5, textarea.span5, .uneditable-input.span5 {
  input.span5,
  textarea.span5,
  .uneditable-input.span5 {
    width: 460px;
  }
  input.span4, textarea.span4, .uneditable-input.span4 {
  input.span4,
  textarea.span4,
  .uneditable-input.span4 {
    width: 360px;
  }
  input.span3, textarea.span3, .uneditable-input.span3 {
  input.span3,
  textarea.span3,
  .uneditable-input.span3 {
    width: 260px;
  }
  input.span2, textarea.span2, .uneditable-input.span2 {
  input.span2,
  textarea.span2,
  .uneditable-input.span2 {
    width: 160px;
  }
  input.span1, textarea.span1, .uneditable-input.span1 {
  input.span1,
  textarea.span1,
  .uneditable-input.span1 {
    width: 60px;
  }
  .thumbnails {
@@ -683,4 +674,142 @@
  .thumbnails > li {
    margin-left: 30px;
  }
  .row-fluid .thumbnails {
    margin-left: 0;
  }
}
@media (max-width: 979px) {
  body {
    padding-top: 0;
  }
  .navbar-fixed-top,
  .navbar-fixed-bottom {
    position: static;
  }
  .navbar-fixed-top {
    margin-bottom: 18px;
  }
  .navbar-fixed-bottom {
    margin-top: 18px;
  }
  .navbar-fixed-top .navbar-inner,
  .navbar-fixed-bottom .navbar-inner {
    padding: 5px;
  }
  .navbar .container {
    width: auto;
    padding: 0;
  }
  .navbar .brand {
    padding-right: 10px;
    padding-left: 10px;
    margin: 0 0 0 -5px;
  }
  .nav-collapse {
    clear: both;
  }
  .nav-collapse .nav {
    float: none;
    margin: 0 0 9px;
  }
  .nav-collapse .nav > li {
    float: none;
  }
  .nav-collapse .nav > li > a {
    margin-bottom: 2px;
  }
  .nav-collapse .nav > .divider-vertical {
    display: none;
  }
  .nav-collapse .nav .nav-header {
    color: #999999;
    text-shadow: none;
  }
  .nav-collapse .nav > li > a,
  .nav-collapse .dropdown-menu a {
    padding: 6px 15px;
    font-weight: bold;
    color: #999999;
    -webkit-border-radius: 3px;
       -moz-border-radius: 3px;
            border-radius: 3px;
  }
  .nav-collapse .btn {
    padding: 4px 10px 4px;
    font-weight: normal;
    -webkit-border-radius: 4px;
       -moz-border-radius: 4px;
            border-radius: 4px;
  }
  .nav-collapse .dropdown-menu li + li a {
    margin-bottom: 2px;
  }
  .nav-collapse .nav > li > a:hover,
  .nav-collapse .dropdown-menu a:hover {
    background-color: #222222;
  }
  .nav-collapse.in .btn-group {
    padding: 0;
    margin-top: 5px;
  }
  .nav-collapse .dropdown-menu {
    position: static;
    top: auto;
    left: auto;
    display: block;
    float: none;
    max-width: none;
    padding: 0;
    margin: 0 15px;
    background-color: transparent;
    border: none;
    -webkit-border-radius: 0;
       -moz-border-radius: 0;
            border-radius: 0;
    -webkit-box-shadow: none;
       -moz-box-shadow: none;
            box-shadow: none;
  }
  .nav-collapse .dropdown-menu:before,
  .nav-collapse .dropdown-menu:after {
    display: none;
  }
  .nav-collapse .dropdown-menu .divider {
    display: none;
  }
  .nav-collapse .navbar-form,
  .nav-collapse .navbar-search {
    float: none;
    padding: 9px 15px;
    margin: 9px 0;
    border-top: 1px solid #222222;
    border-bottom: 1px solid #222222;
    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
       -moz-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);
  }
  .navbar .nav-collapse .nav.pull-right {
    float: none;
    margin-left: 0;
  }
  .nav-collapse,
  .nav-collapse.collapse {
    height: 0;
    overflow: hidden;
  }
  .navbar .btn-navbar {
    display: block;
  }
  .navbar-static .navbar-inner {
    padding-right: 10px;
    padding-left: 10px;
  }
}
@media (min-width: 980px) {
  .nav-collapse.collapse {
    height: auto !important;
    overflow: visible !important;
  }
}
resources/bootstrap/css/bootstrap.css
Diff too large
resources/bootstrap/img/glyphicons-halflings-white.png

resources/bootstrap/img/glyphicons-halflings.png

resources/bootstrap/js/bootstrap.js
@@ -1,5 +1,5 @@
/* ===================================================
 * bootstrap-transition.js v2.0.2
 * bootstrap-transition.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#transitions
 * ===================================================
 * Copyright 2012 Twitter, Inc.
@@ -17,39 +17,49 @@
 * limitations under the License.
 * ========================================================== */
!function( $ ) {
!function ($) {
  $(function () {
    "use strict"
    "use strict"; // jshint ;_;
    /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
     * ======================================================= */
    $.support.transition = (function () {
      var thisBody = document.body || document.documentElement
        , thisStyle = thisBody.style
        , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined
      return support && {
        end: (function () {
          var transitionEnd = "TransitionEnd"
          if ( $.browser.webkit ) {
              transitionEnd = "webkitTransitionEnd"
          } else if ( $.browser.mozilla ) {
              transitionEnd = "transitionend"
          } else if ( $.browser.opera ) {
              transitionEnd = "oTransitionEnd"
      var transitionEnd = (function () {
        var el = document.createElement('bootstrap')
          , transEndEventNames = {
               'WebkitTransition' : 'webkitTransitionEnd'
            ,  'MozTransition'    : 'transitionend'
            ,  'OTransition'      : 'oTransitionEnd'
            ,  'msTransition'     : 'MSTransitionEnd'
            ,  'transition'       : 'transitionend'
            }
          , name
        for (name in transEndEventNames){
          if (el.style[name] !== undefined) {
            return transEndEventNames[name]
          }
          return transitionEnd
        }())
        }
      }())
      return transitionEnd && {
        end: transitionEnd
      }
    })()
  })
}( window.jQuery );/* ==========================================================
 * bootstrap-alert.js v2.0.2
}(window.jQuery);/* ==========================================================
 * bootstrap-alert.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#alerts
 * ==========================================================
 * Copyright 2012 Twitter, Inc.
@@ -68,61 +78,57 @@
 * ========================================================== */
!function( $ ){
!function ($) {
  "use strict"
  "use strict"; // jshint ;_;
 /* ALERT CLASS DEFINITION
  * ====================== */
  var dismiss = '[data-dismiss="alert"]'
    , Alert = function ( el ) {
    , Alert = function (el) {
        $(el).on('click', dismiss, this.close)
      }
  Alert.prototype = {
  Alert.prototype.close = function (e) {
    var $this = $(this)
      , selector = $this.attr('data-target')
      , $parent
    constructor: Alert
  , close: function ( e ) {
      var $this = $(this)
        , selector = $this.attr('data-target')
        , $parent
      if (!selector) {
        selector = $this.attr('href')
        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
      }
      $parent = $(selector)
      $parent.trigger('close')
      e && e.preventDefault()
      $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
      $parent
        .trigger('close')
        .removeClass('in')
      function removeElement() {
        $parent
          .trigger('closed')
          .remove()
      }
      $.support.transition && $parent.hasClass('fade') ?
        $parent.on($.support.transition.end, removeElement) :
        removeElement()
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    }
    $parent = $(selector)
    e && e.preventDefault()
    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
    $parent.trigger(e = $.Event('close'))
    if (e.isDefaultPrevented()) return
    $parent.removeClass('in')
    function removeElement() {
      $parent
        .trigger('closed')
        .remove()
    }
    $.support.transition && $parent.hasClass('fade') ?
      $parent.on($.support.transition.end, removeElement) :
      removeElement()
  }
 /* ALERT PLUGIN DEFINITION
  * ======================= */
  $.fn.alert = function ( option ) {
  $.fn.alert = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('alert')
@@ -141,8 +147,8 @@
    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
  })
}( window.jQuery );/* ============================================================
 * bootstrap-button.js v2.0.2
}(window.jQuery);/* ============================================================
 * bootstrap-button.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#buttons
 * ============================================================
 * Copyright 2012 Twitter, Inc.
@@ -160,58 +166,54 @@
 * limitations under the License.
 * ============================================================ */
!function( $ ){
  "use strict"
!function ($) {
  "use strict"; // jshint ;_;
 /* BUTTON PUBLIC CLASS DEFINITION
  * ============================== */
  var Button = function ( element, options ) {
  var Button = function (element, options) {
    this.$element = $(element)
    this.options = $.extend({}, $.fn.button.defaults, options)
  }
  Button.prototype = {
  Button.prototype.setState = function (state) {
    var d = 'disabled'
      , $el = this.$element
      , data = $el.data()
      , val = $el.is('input') ? 'val' : 'html'
      constructor: Button
    state = state + 'Text'
    data.resetText || $el.data('resetText', $el[val]())
    , setState: function ( state ) {
        var d = 'disabled'
          , $el = this.$element
          , data = $el.data()
          , val = $el.is('input') ? 'val' : 'html'
    $el[val](data[state] || this.options[state])
        state = state + 'Text'
        data.resetText || $el.data('resetText', $el[val]())
    // push to event loop to allow forms to submit
    setTimeout(function () {
      state == 'loadingText' ?
        $el.addClass(d).attr(d, d) :
        $el.removeClass(d).removeAttr(d)
    }, 0)
  }
        $el[val](data[state] || this.options[state])
  Button.prototype.toggle = function () {
    var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
        // push to event loop to allow forms to submit
        setTimeout(function () {
          state == 'loadingText' ?
            $el.addClass(d).attr(d, d) :
            $el.removeClass(d).removeAttr(d)
        }, 0)
      }
    $parent && $parent
      .find('.active')
      .removeClass('active')
    , toggle: function () {
        var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
        $parent && $parent
          .find('.active')
          .removeClass('active')
        this.$element.toggleClass('active')
      }
    this.$element.toggleClass('active')
  }
 /* BUTTON PLUGIN DEFINITION
  * ======================== */
  $.fn.button = function ( option ) {
  $.fn.button = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('button')
@@ -240,8 +242,8 @@
    })
  })
}( window.jQuery );/* ==========================================================
 * bootstrap-carousel.js v2.0.2
}(window.jQuery);/* ==========================================================
 * bootstrap-carousel.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#carousel
 * ==========================================================
 * Copyright 2012 Twitter, Inc.
@@ -260,16 +262,17 @@
 * ========================================================== */
!function( $ ){
!function ($) {
  "use strict"
  "use strict"; // jshint ;_;
 /* CAROUSEL CLASS DEFINITION
  * ========================= */
  var Carousel = function (element, options) {
    this.$element = $(element)
    this.options = $.extend({}, $.fn.carousel.defaults, options)
    this.options = options
    this.options.slide && this.slide(this.options.slide)
    this.options.pause == 'hover' && this.$element
      .on('mouseenter', $.proxy(this.pause, this))
@@ -278,8 +281,11 @@
  Carousel.prototype = {
    cycle: function () {
      this.interval = setInterval($.proxy(this.next, this), this.options.interval)
    cycle: function (e) {
      if (!e) this.paused = false
      this.options.interval
        && !this.paused
        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
      return this
    }
@@ -304,7 +310,8 @@
      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
    }
  , pause: function () {
  , pause: function (e) {
      if (!e) this.paused = true
      clearInterval(this.interval)
      this.interval = null
      return this
@@ -327,6 +334,7 @@
        , direction = type == 'next' ? 'left' : 'right'
        , fallback  = type == 'next' ? 'first' : 'last'
        , that = this
        , e = $.Event('slide')
      this.sliding = true
@@ -336,24 +344,26 @@
      if ($next.hasClass('active')) return
      if (!$.support.transition && this.$element.hasClass('slide')) {
        this.$element.trigger('slide')
        $active.removeClass('active')
        $next.addClass('active')
        this.sliding = false
        this.$element.trigger('slid')
      } else {
      if ($.support.transition && this.$element.hasClass('slide')) {
        this.$element.trigger(e)
        if (e.isDefaultPrevented()) return
        $next.addClass(type)
        $next[0].offsetWidth // force reflow
        $active.addClass(direction)
        $next.addClass(direction)
        this.$element.trigger('slide')
        this.$element.one($.support.transition.end, function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
          setTimeout(function () { that.$element.trigger('slid') }, 0)
        })
      } else {
        this.$element.trigger(e)
        if (e.isDefaultPrevented()) return
        $active.removeClass('active')
        $next.addClass('active')
        this.sliding = false
        this.$element.trigger('slid')
      }
      isCycling && this.cycle()
@@ -367,15 +377,15 @@
 /* CAROUSEL PLUGIN DEFINITION
  * ========================== */
  $.fn.carousel = function ( option ) {
  $.fn.carousel = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('carousel')
        , options = typeof option == 'object' && option
        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
      if (typeof option == 'number') data.to(option)
      else if (typeof option == 'string' || (option = options.slide)) data[option]()
      else data.cycle()
      else if (options.interval) data.cycle()
    })
  }
@@ -400,8 +410,8 @@
    })
  })
}( window.jQuery );/* =============================================================
 * bootstrap-collapse.js v2.0.2
}(window.jQuery);/* =============================================================
 * bootstrap-collapse.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#collapse
 * =============================================================
 * Copyright 2012 Twitter, Inc.
@@ -419,16 +429,21 @@
 * limitations under the License.
 * ============================================================ */
!function( $ ){
  "use strict"
!function ($) {
  var Collapse = function ( element, options ) {
      this.$element = $(element)
  "use strict"; // jshint ;_;
 /* COLLAPSE PUBLIC CLASS DEFINITION
  * ================================ */
  var Collapse = function (element, options) {
    this.$element = $(element)
    this.options = $.extend({}, $.fn.collapse.defaults, options)
    if (this.options["parent"]) {
      this.$parent = $(this.options["parent"])
    if (this.options.parent) {
      this.$parent = $(this.options.parent)
    }
    this.options.toggle && this.toggle()
@@ -444,31 +459,39 @@
    }
  , show: function () {
      var dimension = this.dimension()
        , scroll = $.camelCase(['scroll', dimension].join('-'))
        , actives = this.$parent && this.$parent.find('.in')
      var dimension
        , scroll
        , actives
        , hasData
      if (this.transitioning) return
      dimension = this.dimension()
      scroll = $.camelCase(['scroll', dimension].join('-'))
      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
      if (actives && actives.length) {
        hasData = actives.data('collapse')
        if (hasData && hasData.transitioning) return
        actives.collapse('hide')
        hasData || actives.data('collapse', null)
      }
      this.$element[dimension](0)
      this.transition('addClass', 'show', 'shown')
      this.transition('addClass', $.Event('show'), 'shown')
      this.$element[dimension](this.$element[0][scroll])
    }
  , hide: function () {
      var dimension = this.dimension()
      var dimension
      if (this.transitioning) return
      dimension = this.dimension()
      this.reset(this.$element[dimension]())
      this.transition('removeClass', 'hide', 'hidden')
      this.transition('removeClass', $.Event('hide'), 'hidden')
      this.$element[dimension](0)
    }
  , reset: function ( size ) {
  , reset: function (size) {
      var dimension = this.dimension()
      this.$element
@@ -476,37 +499,43 @@
        [dimension](size || 'auto')
        [0].offsetWidth
      this.$element[size ? 'addClass' : 'removeClass']('collapse')
      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
      return this
    }
  , transition: function ( method, startEvent, completeEvent ) {
  , transition: function (method, startEvent, completeEvent) {
      var that = this
        , complete = function () {
            if (startEvent == 'show') that.reset()
            if (startEvent.type == 'show') that.reset()
            that.transitioning = 0
            that.$element.trigger(completeEvent)
          }
      this.$element
        .trigger(startEvent)
        [method]('in')
      this.$element.trigger(startEvent)
      if (startEvent.isDefaultPrevented()) return
      this.transitioning = 1
      this.$element[method]('in')
      $.support.transition && this.$element.hasClass('collapse') ?
        this.$element.one($.support.transition.end, complete) :
        complete()
      }
    }
  , toggle: function () {
      this[this.$element.hasClass('in') ? 'hide' : 'show']()
      }
    }
  }
  /* COLLAPSIBLE PLUGIN DEFINITION
 /* COLLAPSIBLE PLUGIN DEFINITION
  * ============================== */
  $.fn.collapse = function ( option ) {
  $.fn.collapse = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('collapse')
@@ -537,8 +566,8 @@
    })
  })
}( window.jQuery );/* ============================================================
 * bootstrap-dropdown.js v2.0.2
}(window.jQuery);/* ============================================================
 * bootstrap-dropdown.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#dropdowns
 * ============================================================
 * Copyright 2012 Twitter, Inc.
@@ -557,15 +586,16 @@
 * ============================================================ */
!function( $ ){
!function ($) {
  "use strict"
  "use strict"; // jshint ;_;
 /* DROPDOWN CLASS DEFINITION
  * ========================= */
  var toggle = '[data-toggle="dropdown"]'
    , Dropdown = function ( element ) {
    , Dropdown = function (element) {
        var $el = $(element).on('click.dropdown.data-api', this.toggle)
        $('html').on('click.dropdown.data-api', function () {
          $el.parent().removeClass('open')
@@ -576,11 +606,15 @@
    constructor: Dropdown
  , toggle: function ( e ) {
  , toggle: function (e) {
      var $this = $(this)
        , selector = $this.attr('data-target')
        , $parent
        , selector
        , isActive
      if ($this.is('.disabled, :disabled')) return
      selector = $this.attr('data-target')
      if (!selector) {
        selector = $this.attr('href')
@@ -593,7 +627,8 @@
      isActive = $parent.hasClass('open')
      clearMenus()
      !isActive && $parent.toggleClass('open')
      if (!isActive) $parent.toggleClass('open')
      return false
    }
@@ -608,7 +643,7 @@
  /* DROPDOWN PLUGIN DEFINITION
   * ========================== */
  $.fn.dropdown = function ( option ) {
  $.fn.dropdown = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('dropdown')
@@ -625,11 +660,13 @@
  $(function () {
    $('html').on('click.dropdown.data-api', clearMenus)
    $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    $('body')
      .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
      .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
  })
}( window.jQuery );/* =========================================================
 * bootstrap-modal.js v2.0.2
}(window.jQuery);/* =========================================================
 * bootstrap-modal.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#modals
 * =========================================================
 * Copyright 2012 Twitter, Inc.
@@ -648,14 +685,15 @@
 * ========================================================= */
!function( $ ){
!function ($) {
  "use strict"
  "use strict"; // jshint ;_;
 /* MODAL CLASS DEFINITION
  * ====================== */
  var Modal = function ( content, options ) {
  var Modal = function (content, options) {
    this.options = options
    this.$element = $(content)
      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
@@ -671,19 +709,23 @@
    , show: function () {
        var that = this
          , e = $.Event('show')
        if (this.isShown) return
        this.$element.trigger(e)
        if (this.isShown || e.isDefaultPrevented()) return
        $('body').addClass('modal-open')
        this.isShown = true
        this.$element.trigger('show')
        escape.call(this)
        backdrop.call(this, function () {
          var transition = $.support.transition && that.$element.hasClass('fade')
          !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position
          if (!that.$element.parent().length) {
            that.$element.appendTo(document.body) //don't move modals dom position
          }
          that.$element
            .show()
@@ -701,21 +743,24 @@
        })
      }
    , hide: function ( e ) {
    , hide: function (e) {
        e && e.preventDefault()
        if (!this.isShown) return
        var that = this
        e = $.Event('hide')
        this.$element.trigger(e)
        if (!this.isShown || e.isDefaultPrevented()) return
        this.isShown = false
        $('body').removeClass('modal-open')
        escape.call(this)
        this.$element
          .trigger('hide')
          .removeClass('in')
        this.$element.removeClass('in')
        $.support.transition && this.$element.hasClass('fade') ?
          hideWithTransition.call(this) :
@@ -741,7 +786,7 @@
    })
  }
  function hideModal( that ) {
  function hideModal(that) {
    this.$element
      .hide()
      .trigger('hidden')
@@ -749,7 +794,7 @@
    backdrop.call(this)
  }
  function backdrop( callback ) {
  function backdrop(callback) {
    var that = this
      , animate = this.$element.hasClass('fade') ? 'fade' : ''
@@ -803,7 +848,7 @@
 /* MODAL PLUGIN DEFINITION
  * ======================= */
  $.fn.modal = function ( option ) {
  $.fn.modal = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('modal')
@@ -837,8 +882,8 @@
    })
  })
}( window.jQuery );/* ===========================================================
 * bootstrap-tooltip.js v2.0.2
}(window.jQuery);/* ===========================================================
 * bootstrap-tooltip.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#tooltips
 * Inspired by the original jQuery.tipsy by Jason Frame
 * ===========================================================
@@ -857,14 +902,16 @@
 * limitations under the License.
 * ========================================================== */
!function( $ ) {
  "use strict"
!function ($) {
  "use strict"; // jshint ;_;
 /* TOOLTIP PUBLIC CLASS DEFINITION
  * =============================== */
  var Tooltip = function ( element, options ) {
  var Tooltip = function (element, options) {
    this.init('tooltip', element, options)
  }
@@ -872,7 +919,7 @@
    constructor: Tooltip
  , init: function ( type, element, options ) {
  , init: function (type, element, options) {
      var eventIn
        , eventOut
@@ -893,7 +940,7 @@
        this.fixTitle()
    }
  , getOptions: function ( options ) {
  , getOptions: function (options) {
      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
      if (options.delay && typeof options.delay == 'number') {
@@ -906,34 +953,28 @@
      return options
    }
  , enter: function ( e ) {
  , enter: function (e) {
      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
      if (!self.options.delay || !self.options.delay.show) {
        self.show()
      } else {
        self.hoverState = 'in'
        setTimeout(function() {
          if (self.hoverState == 'in') {
            self.show()
          }
        }, self.options.delay.show)
      }
      if (!self.options.delay || !self.options.delay.show) return self.show()
      clearTimeout(this.timeout)
      self.hoverState = 'in'
      this.timeout = setTimeout(function() {
        if (self.hoverState == 'in') self.show()
      }, self.options.delay.show)
    }
  , leave: function ( e ) {
  , leave: function (e) {
      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
      if (!self.options.delay || !self.options.delay.hide) {
        self.hide()
      } else {
        self.hoverState = 'out'
        setTimeout(function() {
          if (self.hoverState == 'out') {
            self.hide()
          }
        }, self.options.delay.hide)
      }
      if (this.timeout) clearTimeout(this.timeout)
      if (!self.options.delay || !self.options.delay.hide) return self.hide()
      self.hoverState = 'out'
      this.timeout = setTimeout(function() {
        if (self.hoverState == 'out') self.hide()
      }, self.options.delay.hide)
    }
  , show: function () {
@@ -991,9 +1032,20 @@
      }
    }
  , isHTML: function(text) {
      // html string detection logic adapted from jQuery
      return typeof text != 'string'
        || ( text.charAt(0) === "<"
          && text.charAt( text.length - 1 ) === ">"
          && text.length >= 3
        ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text)
    }
  , setContent: function () {
      var $tip = this.tip()
      $tip.find('.tooltip-inner').html(this.getTitle())
        , title = this.getTitle()
      $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title)
      $tip.removeClass('fade in top bottom left right')
    }
@@ -1044,8 +1096,6 @@
      title = $e.attr('data-original-title')
        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
      title = (title || '').toString().replace(/(^\s*|\s*$)/, "")
      return title
    }
@@ -1098,16 +1148,17 @@
  $.fn.tooltip.defaults = {
    animation: true
  , delay: 0
  , selector: false
  , placement: 'top'
  , selector: false
  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
  , trigger: 'hover'
  , title: ''
  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
  , delay: 0
  }
}( window.jQuery );/* ===========================================================
 * bootstrap-popover.js v2.0.2
}(window.jQuery);
/* ===========================================================
 * bootstrap-popover.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#popovers
 * ===========================================================
 * Copyright 2012 Twitter, Inc.
@@ -1126,13 +1177,18 @@
 * =========================================================== */
!function( $ ) {
!function ($) {
 "use strict"
  "use strict"; // jshint ;_;
 /* POPOVER PUBLIC CLASS DEFINITION
  * =============================== */
  var Popover = function ( element, options ) {
    this.init('popover', element, options)
  }
  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
     ========================================== */
@@ -1146,8 +1202,8 @@
        , title = this.getTitle()
        , content = this.getContent()
      $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title)
      $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content)
      $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title)
      $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content)
      $tip.removeClass('fade top bottom left right in')
    }
@@ -1164,12 +1220,10 @@
      content = $e.attr('data-content')
        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
      content = content.toString().replace(/(^\s*|\s*$)/, "")
      return content
    }
  , tip: function() {
  , tip: function () {
      if (!this.$tip) {
        this.$tip = $(this.options.template)
      }
@@ -1182,7 +1236,7 @@
 /* POPOVER PLUGIN DEFINITION
  * ======================= */
  $.fn.popover = function ( option ) {
  $.fn.popover = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('popover')
@@ -1200,8 +1254,8 @@
  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
  })
}( window.jQuery );/* =============================================================
 * bootstrap-scrollspy.js v2.0.2
}(window.jQuery);/* =============================================================
 * bootstrap-scrollspy.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#scrollspy
 * =============================================================
 * Copyright 2012 Twitter, Inc.
@@ -1219,9 +1273,11 @@
 * limitations under the License.
 * ============================================================== */
!function ( $ ) {
  "use strict"
!function ($) {
  "use strict"; // jshint ;_;
  /* SCROLLSPY CLASS DEFINITION
   * ========================== */
@@ -1235,7 +1291,7 @@
    this.selector = (this.options.target
      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
      || '') + ' .nav li > a'
    this.$body = $('body').on('click.scroll.data-api', this.selector, process)
    this.$body = $('body')
    this.refresh()
    this.process()
  }
@@ -1245,24 +1301,42 @@
      constructor: ScrollSpy
    , refresh: function () {
        this.targets = this.$body
        var self = this
          , $targets
        this.offsets = $([])
        this.targets = $([])
        $targets = this.$body
          .find(this.selector)
          .map(function () {
            var href = $(this).attr('href')
            return /^#\w/.test(href) && $(href).length ? href : null
            var $el = $(this)
              , href = $el.data('target') || $el.attr('href')
              , $href = /^#\w/.test(href) && $(href)
            return ( $href
              && href.length
              && [[ $href.position().top, href ]] ) || null
          })
        this.offsets = $.map(this.targets, function (id) {
          return $(id).position().top
        })
          .sort(function (a, b) { return a[0] - b[0] })
          .each(function () {
            self.offsets.push(this[0])
            self.targets.push(this[1])
          })
      }
    , process: function () {
        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
          , maxScroll = scrollHeight - this.$scrollElement.height()
          , offsets = this.offsets
          , targets = this.targets
          , activeTarget = this.activeTarget
          , i
        if (scrollTop >= maxScroll) {
          return activeTarget != (i = targets.last()[0])
            && this.activate ( i )
        }
        for (i = offsets.length; i--;) {
          activeTarget != targets[i]
@@ -1274,21 +1348,27 @@
    , activate: function (target) {
        var active
          , selector
        this.activeTarget = target
        this.$body
          .find(this.selector).parent('.active')
        $(this.selector)
          .parent('.active')
          .removeClass('active')
        active = this.$body
          .find(this.selector + '[href="' + target + '"]')
        selector = this.selector
          + '[data-target="' + target + '"],'
          + this.selector + '[href="' + target + '"]'
        active = $(selector)
          .parent('li')
          .addClass('active')
        if ( active.parent('.dropdown-menu') )  {
          active.closest('li.dropdown').addClass('active')
        if (active.parent('.dropdown-menu'))  {
          active = active.closest('li.dropdown').addClass('active')
        }
        active.trigger('activate')
      }
  }
@@ -1324,8 +1404,8 @@
    })
  })
}( window.jQuery );/* ========================================================
 * bootstrap-tab.js v2.0.2
}(window.jQuery);/* ========================================================
 * bootstrap-tab.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#tabs
 * ========================================================
 * Copyright 2012 Twitter, Inc.
@@ -1344,9 +1424,10 @@
 * ======================================================== */
!function( $ ){
!function ($) {
  "use strict"
  "use strict"; // jshint ;_;
 /* TAB CLASS DEFINITION
  * ==================== */
@@ -1365,6 +1446,7 @@
        , selector = $this.attr('data-target')
        , previous
        , $target
        , e
      if (!selector) {
        selector = $this.attr('href')
@@ -1375,10 +1457,13 @@
      previous = $ul.find('.active a').last()[0]
      $this.trigger({
        type: 'show'
      , relatedTarget: previous
      e = $.Event('show', {
        relatedTarget: previous
      })
      $this.trigger(e)
      if (e.isDefaultPrevented()) return
      $target = $(selector)
@@ -1453,8 +1538,8 @@
    })
  })
}( window.jQuery );/* =============================================================
 * bootstrap-typeahead.js v2.0.2
}(window.jQuery);/* =============================================================
 * bootstrap-typeahead.js v2.0.4
 * http://twitter.github.com/bootstrap/javascript.html#typeahead
 * =============================================================
 * Copyright 2012 Twitter, Inc.
@@ -1472,16 +1557,22 @@
 * limitations under the License.
 * ============================================================ */
!function( $ ){
  "use strict"
!function($){
  var Typeahead = function ( element, options ) {
  "use strict"; // jshint ;_;
 /* TYPEAHEAD PUBLIC CLASS DEFINITION
  * ================================= */
  var Typeahead = function (element, options) {
    this.$element = $(element)
    this.options = $.extend({}, $.fn.typeahead.defaults, options)
    this.matcher = this.options.matcher || this.matcher
    this.sorter = this.options.sorter || this.sorter
    this.highlighter = this.options.highlighter || this.highlighter
    this.updater = this.options.updater || this.updater
    this.$menu = $(this.options.menu).appendTo('body')
    this.source = this.options.source
    this.shown = false
@@ -1494,9 +1585,14 @@
  , select: function () {
      var val = this.$menu.find('.active').attr('data-value')
      this.$element.val(val)
      this.$element.change();
      this.$element
        .val(this.updater(val))
        .change()
      return this.hide()
    }
  , updater: function (item) {
      return item
    }
  , show: function () {
@@ -1532,7 +1628,7 @@
      }
      items = $.grep(this.source, function (item) {
        if (that.matcher(item)) return item
        return that.matcher(item)
      })
      items = this.sorter(items)
@@ -1564,7 +1660,8 @@
    }
  , highlighter: function (item) {
      return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) {
      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
        return '<strong>' + match + '</strong>'
      })
    }
@@ -1656,11 +1753,13 @@
          break
        case 38: // up arrow
          if (e.type != 'keydown') break
          e.preventDefault()
          this.prev()
          break
        case 40: // down arrow
          if (e.type != 'keydown') break
          e.preventDefault()
          this.next()
          break
@@ -1691,7 +1790,7 @@
  /* TYPEAHEAD PLUGIN DEFINITION
   * =========================== */
  $.fn.typeahead = function ( option ) {
  $.fn.typeahead = function (option) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('typeahead')
@@ -1723,4 +1822,4 @@
    })
  })
}( window.jQuery );
}(window.jQuery);
resources/gitblit.css
@@ -40,8 +40,16 @@
    color: #0069D6;
}
.navbar {
    height:40px !important;
.navbar .brand {
    padding: 7px 20px;
}
.navbar .pull-right {
    margin: 0;
}
.navbar ul.nav {
    margin: 0 !important;
}
.navbar ul.nav li a {
@@ -52,10 +60,14 @@
.navbar ul.nav li a:hover {
    color: #abd4ff !important;
    text-decoration: underline;
}
.navbar .nav .active > a:hover {
    text-decoration: underline;
}
.navbar-inner {
    height:40px !important;
    background-color:#000050;
    background-repeat:repeat-x;
    background-image:-khtml-gradient(linear, left top, left bottom, from(#000060), to(#000040));
@@ -77,6 +89,7 @@
    background-image: url(arrow_page.png);
    background-position: center bottom;
    outline: 0;
    padding-bottom:1px;
}
.navbar .active a {
@@ -811,7 +824,7 @@
}
td.date {
    /*font-style: italic !important;*/
    /*font-style: italic !important;*/
}
span.sha1, span.sha1 a, span.sha1 a span, pre.commit_message {
src/com/gitblit/utils/ActivityUtils.java
@@ -151,12 +151,12 @@
     * @param email
     *            address to query Gravatar
     * @param width
     *            size of thumbnail. if width <= 0, the defalt of 60 is used.
     *            size of thumbnail. if width <= 0, the default of 50 is used.
     * @return
     */
    public static String getGravatarThumbnailUrl(String email, int width) {
        if (width <= 0) {
            width = 60;
            width = 50;
        }
        String emailHash = StringUtils.getMD5(email);
        String url = MessageFormat.format(
src/com/gitblit/wicket/pages/ActivityPage.html
@@ -8,10 +8,10 @@
    <div class="pageTitle">
        <h2><wicket:message key="gb.recentActivity"></wicket:message><small> / <span wicket:id="subheader">[days back]</span></small></h2>
    </div>
    <div style="height: 155px;text-align: center;">
    <div class="hidden-phone" style="height: 155px;text-align: center;">
        <table>
        <tr>
        <td><span id="chartDaily"></span></td>
        <td><span class="hidden-tablet" id="chartDaily"></span></td>
        <td><span id="chartRepositories"></span></td>
        <td><span id="chartAuthors"></span></td>
        </tr>
src/com/gitblit/wicket/pages/BasePage.html
@@ -8,14 +8,10 @@
    <wicket:head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
           <title wicket:id="title">[page title]</title>
        <link rel="stylesheet" href="bootstrap/css/bootstrap.css"/>
        <link rel="stylesheet" type="text/css" href="gitblit.css"/>
        <!-- Responsive CSS must be included after the above body css! -->
        <!-- <link rel="stylesheet" href="bootstrap/css/bootstrap-responsive.css"/> -->
        <link rel="icon" href="gitblt-favicon.png" type="image/png" />
        
        <script type="text/javascript" src="bootstrap/js/jquery.js"></script>
        <script type="text/javascript" src="bootstrap/js/bootstrap.js"></script>
        <link rel="stylesheet" href="bootstrap/css/bootstrap.css"/>
        <link rel="stylesheet" type="text/css" href="gitblit.css"/>
    </wicket:head>
    <body>
@@ -34,7 +30,23 @@
                <div wicket:id="userPanel">[user panel]</div>
            </footer>
        </div>
        <!-- Override Bootstrap's responsive menu background highlighting -->
        <style>
        @media (max-width: 979px) {
            .nav-collapse .nav > li > a:hover, .nav-collapse .dropdown-menu a:hover {
                background-color: #000070;
            }
            .navbar div > ul .dropdown-menu li a {
                color: #ccc;
            }
        }
        </style>
        
        <!-- Include scripts at end for faster page loading -->
        <script type="text/javascript" src="bootstrap/js/jquery.js"></script>
        <script type="text/javascript" src="bootstrap/js/bootstrap.js"></script>
    </body>
    
    <!-- user fragment -->
src/com/gitblit/wicket/pages/BasePage.java
@@ -27,6 +27,7 @@
import org.apache.wicket.PageParameters;
import org.apache.wicket.RestartResponseAtInterceptPageException;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.CSSPackageResource;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
@@ -57,15 +58,23 @@
    public BasePage() {
        super();
        logger = LoggerFactory.getLogger(getClass());
        customizeHeader();
        loginByCookie();
    }
    public BasePage(PageParameters params) {
        super(params);
        logger = LoggerFactory.getLogger(getClass());
        customizeHeader();
        loginByCookie();
    }
    
    private void customizeHeader() {
        if (GitBlit.getBoolean(Keys.web.useResponsiveLayout, true)) {
            add(CSSPackageResource.getHeaderContribution("bootstrap/css/bootstrap-responsive.css"));
        }
    }
    @Override
    protected void onBeforeRender() {
        if (GitBlit.isDebugMode()) {
src/com/gitblit/wicket/pages/CommitDiffPage.html
@@ -27,7 +27,7 @@
        <tr wicket:id="changedPath">
            <td class="changeType"><span wicket:id="changeType">[change type]</span></td>        
            <td class="path"><span wicket:id="pathName">[commit path]</span></td>            
            <td class="rightAlign">
            <td class="hidden-phone rightAlign">
                <span class="link">
                    <a wicket:id="patch"><wicket:message key="gb.patch"></wicket:message></a> | <a wicket:id="view"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="blame"><wicket:message key="gb.blame"></wicket:message></a> | <a wicket:id="history"><wicket:message key="gb.history"></wicket:message></a>
                </span>
src/com/gitblit/wicket/pages/CommitPage.html
@@ -15,9 +15,10 @@
    <!-- commit header -->
    <div wicket:id="commitHeader">[commit header]</div>
    
    <!--  Author Gravatar -->
    <span style="float:right;vertical-align: top;" wicket:id="authorAvatar" />
    <div class="row">
    
    <div class="span10">
    <!-- commit info -->
    <table class="plain">
        <tr><th><wicket:message key="gb.refs">refs</wicket:message></th><td><div wicket:id="refsPanel">[references]</div></td></tr>
@@ -43,6 +44,9 @@
            </td>
        </tr>
    </table>
    </div>
    </div>
    
    <!-- full message -->
    <pre class="commit_message" wicket:id="fullMessage">[commit message]</pre>
@@ -74,7 +78,7 @@
        <tr wicket:id="changedPath">
            <td class="changeType"><span wicket:id="changeType">[change type]</span></td>
            <td class="path"><span wicket:id="pathName">[commit path]</span></td>            
            <td class="rightAlign">
            <td class="hidden-phone rightAlign">
                <span class="link">
                    <a wicket:id="diff"><wicket:message key="gb.diff"></wicket:message></a> | <a wicket:id="view"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="blame"><wicket:message key="gb.blame"></wicket:message></a> | <a wicket:id="history"><wicket:message key="gb.history"></wicket:message></a>
                </span>
src/com/gitblit/wicket/pages/CommitPage.java
@@ -82,7 +82,6 @@
        add(createPersonPanel("commitAuthor", c.getAuthorIdent(), Constants.SearchType.AUTHOR));
        add(WicketUtils.createTimestampLabel("commitAuthorDate", c.getAuthorIdent().getWhen(),
                getTimeZone()));
        add(new GravatarImage("authorAvatar", c.getAuthorIdent()));
        
        // committer
        add(createPersonPanel("commitCommitter", c.getCommitterIdent(), Constants.SearchType.COMMITTER));
src/com/gitblit/wicket/pages/LuceneSearchPage.html
@@ -17,8 +17,8 @@
    <div class="pageTitle">
        <h2><wicket:message key="gb.search"></wicket:message></h2>
    </div>
    <form class="form-inline" style="margin:0px;" wicket:id="searchForm">
        <div class="row-fluid">
    <form class="form-inline" wicket:id="searchForm">
        <div class="row">
            <div class="span3">
                <h3><wicket:message key="gb.repositories"></wicket:message></h3>
                <select wicket:id="repositories" ></select>
src/com/gitblit/wicket/pages/RepositoryPage.html
@@ -21,30 +21,32 @@
                
                    <div class="nav-collapse" wicket:id="navPanel"></div>
                
                    <a class="brand" style="text-decoration: none;" wicket:id="syndication">
                    <a class="hidden-phone hidden-tablet brand" style="text-decoration: none;" wicket:id="syndication">
                        <img style="border:0px;vertical-align:middle;" src="feed_16x16.png"></img>
                    </a>
                
                        <form class="pull-right" style="margin-top:7px;" wicket:id="searchForm">
                            <span class="search">
                                <select class="small" wicket:id="searchType"/>
                                <input type="text" id="searchBox" wicket:id="searchBox" value=""/>
                            </span>
                        </form>
                    <form class="hidden-phone hidden-tablet pull-right" style="margin-top:7px;" wicket:id="searchForm">
                        <span class="search">
                            <select class="small" wicket:id="searchType"/>
                            <input type="text" id="searchBox" wicket:id="searchBox" value=""/>
                        </span>
                    </form>
                </div>
            </div>
        </div>
                
        <!-- page content -->
        <div class="container">
            <div style="text-align:center;padding-top:5px;" wicket:id="feedback">[Feedback Panel]</div>
            <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
            <!-- page header -->
            <div class="pageTitle">
                <span wicket:id="workingCopy"></span>
                <h2><span wicket:id="repositoryName">[repository name]</span> <small><span wicket:id="pageName">[page name]</span></small></h2>
                <div class="row">
                    <div wicket:id="workingCopy"></div>
                    <div class="span9">
                        <h2><span wicket:id="repositoryName">[repository name]</span> <small><span wicket:id="pageName">[page name]</span></small></h2>
                    </div>
                </div>
            </div>
            <wicket:child />
src/com/gitblit/wicket/pages/RepositoryPage.java
@@ -153,7 +153,7 @@
    protected void setupPage(String repositoryName, String pageName) {
        add(new LinkPanel("repositoryName", null, StringUtils.stripDotGit(repositoryName),
                SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryName)));
        add(new Label("pageName", pageName));
        add(new Label("pageName", pageName).setRenderBodyOnly(true));
        if (getRepositoryModel().isBare) {
            add(new Label("workingCopy").setVisible(false));
        } else {
src/com/gitblit/wicket/pages/RootPage.html
@@ -19,21 +19,21 @@
                
                <div class="nav-collapse" wicket:id="navPanel"></div>
                
                <form class="pull-right" style="margin-top:5px;" wicket:id="loginForm">
                <form class="pull-right" wicket:id="loginForm">
                    <span class="form-search">
                        <input wicket:id="username" class="input-small" type="text" />
                        <input wicket:id="password" class="input-small" type="password" />
                        <button class="btn btn-primary" style="margin-top:0px; "type="submit"><wicket:message key="gb.login"></wicket:message></button>
                        <button class="btn btn-primary" type="submit"><wicket:message key="gb.login"></wicket:message></button>
                    </span>
                </form>
            </div>
        </div>
    </div>
    <div style="text-align:center;padding-top:5px;" wicket:id="feedback">[Feedback Panel]</div>
    <!-- subclass content -->
    <div class="container">
        <div style="text-align:center" wicket:id="feedback">[Feedback Panel]</div>
        <wicket:child/>
    </div>
</wicket:extend>
src/com/gitblit/wicket/pages/SummaryPage.html
@@ -8,7 +8,7 @@
    
    <div style="clear:both;">
        <!-- Repository Activity Chart -->    
        <div style="float:right;">
        <div class="hidden-phone" style="float:right;">
            <img class="activityGraph" wicket:id="commitsChart" />
        </div>    
    
@@ -17,8 +17,8 @@
            <table class="plain">
                <tr><th><wicket:message key="gb.description">[description]</wicket:message></th><td><span wicket:id="repositoryDescription">[repository description]</span></td></tr>
                <tr><th><wicket:message key="gb.owner">[owner]</wicket:message></th><td><span wicket:id="repositoryOwner">[repository owner]</span></td></tr>
                <tr><th><wicket:message key="gb.lastChange">[last change]</wicket:message></th><td><span wicket:id="repositoryLastChange">[repository last change]</span></td></tr>
                <tr><th><wicket:message key="gb.stats">[stats]</wicket:message></th><td><span wicket:id="branchStats">[branch stats]</span> <span class="link"><a wicket:id="metrics"><wicket:message key="gb.metrics">[metrics]</wicket:message></a></span></td></tr>
                <tr class="hidden-phone"><th><wicket:message key="gb.lastChange">[last change]</wicket:message></th><td><span wicket:id="repositoryLastChange">[repository last change]</span></td></tr>
                <tr class="hidden-phone"><th><wicket:message key="gb.stats">[stats]</wicket:message></th><td><span wicket:id="branchStats">[branch stats]</span> <span class="link"><a wicket:id="metrics"><wicket:message key="gb.metrics">[metrics]</wicket:message></a></span></td></tr>
                <tr><th valign="middle"><wicket:message key="gb.repositoryUrl">[URL]</wicket:message></th><td><img style="vertical-align: middle;" wicket:id="accessRestrictionIcon" /><span wicket:id="repositoryCloneUrl">[repository clone url]</span><div wicket:id="otherUrls" style="margin-left:20px;"></div></td></tr>
            </table>
        </div>
src/com/gitblit/wicket/pages/SummaryPage.java
@@ -189,7 +189,7 @@
                && GitBlit.getBoolean(Keys.web.generateActivityGraph, true)) {
            IChartData data = WicketUtils.getChartData(metrics);
            ChartProvider provider = new ChartProvider(new Dimension(340, 100), ChartType.LINE,
            ChartProvider provider = new ChartProvider(new Dimension(290, 100), ChartType.LINE,
                    data);
            ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
            dateAxis.setLabels(new String[] { metrics.get(0).name,
src/com/gitblit/wicket/pages/TreePage.html
@@ -24,7 +24,7 @@
            <td class="icon"><img wicket:id="pathIcon" /></td>
            <td><span wicket:id="pathName"></span></td>            
            <td class="size"><span wicket:id="pathSize">[path size]</span></td>
            <td class="mode"><span wicket:id="pathPermissions">[path permissions]</span></td>
            <td class="hidden-phone mode"><span wicket:id="pathPermissions">[path permissions]</span></td>
            <td class="treeLinks"><span wicket:id="pathLinks">[path links]</span></td>
        </tr>
    </table>
src/com/gitblit/wicket/panels/ActivityPanel.html
@@ -11,11 +11,11 @@
        <div class="header"><i class="icon-refresh" style="vertical-align: middle;"></i> <span style="font-weight:bold;" wicket:id="title">[title]</span></div>
        <table class="activity">
            <tr wicket:id="commit">
                <td class="date" style="width:60px; vertical-align: middle;text-align: right;padding-right:10px;" ><span wicket:id="time">[time of day]</span></td>
                <td class="hidden-phone date" style="width:60px; vertical-align: middle;text-align: right;padding-right:10px;" ><span wicket:id="time">[time of day]</span></td>
                <td style="width:10em;text-align:left;vertical-align: middle;">
                    <span wicket:id="repository" class="repositorySwatch">[repository link]</span>
                </td>
                <td style="width:30px;vertical-align: middle;"><span wicket:id="avatar" style="vertical-align: middle;"></span></td>
                <td class="hidden-phone" style="width:30px;vertical-align: middle;"><span wicket:id="avatar" style="vertical-align: middle;"></span></td>
                <td style="vertical-align: middle;">
                    <img wicket:id="commitIcon" style="vertical-align: middle;"></img>
                    <span wicket:id="message">[shortlog commit link]</span><br/>
@@ -24,7 +24,7 @@
                <td style="text-align:right;vertical-align: middle;">
                    <div wicket:id="commitRefs">[commit refs]</div>
                </td>
                <td class="rightAlign" style="width:7em;vertical-align: middle;">
                <td class="hidden-phone rightAlign" style="width:7em;vertical-align: middle;">
                    <span class="link">
                        <a wicket:id="view" target="_blank"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="diff" target="_blank"><wicket:message key="gb.diff"></wicket:message></a> | <a wicket:id="tree" target="_blank"><wicket:message key="gb.tree"></wicket:message></a>
                    </span>
src/com/gitblit/wicket/panels/BranchesPanel.html
@@ -15,9 +15,9 @@
               <tr wicket:id="branch">
                 <td class="date"><span wicket:id="branchDate">[branch date]</span></td>
                 <td><span wicket:id="branchName">[branch name]</span></td>
                 <td class="author"><span wicket:id="branchAuthor">[branch author]</span></td>
                 <td><span wicket:id="branchLog">[branch log]</span></td>
                 <td class="rightAlign">
                 <td class="hidden-phone hidden-tablet author"><span wicket:id="branchAuthor">[branch author]</span></td>
                 <td class="hidden-phone"><span wicket:id="branchLog">[branch log]</span></td>
                 <td class="hidden-phone rightAlign">
                     <span wicket:id="branchLinks"></span>
                </td>
               </tr>
src/com/gitblit/wicket/panels/CommitHeaderPanel.html
@@ -6,10 +6,19 @@
<wicket:panel>    
    <div class="commitHeader">
        <div style="float:right;">
            <span wicket:id="author">[author]</span> &nbsp; &nbsp;<span wicket:id="date">[date]</span>
        <div class="row">
            <div>
                <span class="pull-right" wicket:id="authorAvatar"></span>
            </div>
            <div class="span9">
                    <div wicket:id="shortmessage">[short message]</div>
                    <div wicket:id="author">[author]</div>
                    <div>
                         <span wicket:id="date">[date]</span>
                         <span class="hidden-phone" style="padding-left:20px;color:#888;" wicket:id="commitid">[commit id]</span>
                     </div>
            </div>
        </div>
        <span wicket:id="shortmessage">[short message]</span> <span wicket:id="commitid">[commit id]</span>
    </div>
</wicket:panel>
</html>
src/com/gitblit/wicket/panels/CommitHeaderPanel.java
@@ -40,8 +40,9 @@
        add(new LinkPanel("shortmessage", "title", StringUtils.trimString(c.getShortMessage(),
                Constants.LEN_SHORTLOG), CommitPage.class,
                WicketUtils.newObjectParameter(repositoryName, c.getName())));
        add(new Label("commitid", "(" + c.getName().substring(0, 8) + ")"));
        add(new Label("commitid", c.getName()));
        add(new Label("author", c.getAuthorIdent().getName()));
        add(WicketUtils.createDateLabel("date", c.getAuthorIdent().getWhen(), getTimeZone()));
        add(new GravatarImage("authorAvatar", c.getAuthorIdent()));
    }
}
src/com/gitblit/wicket/panels/HistoryPanel.html
@@ -18,9 +18,9 @@
               <tr wicket:id="commit">
                 <td class="date"><span wicket:id="commitDate">[commit date]</span></td>
                 <td class="icon"><img wicket:id="commitIcon" /></td>
                 <td class="author"><span wicket:id="commitAuthor">[commit author]</span></td>
                 <td class="hidden-phone author"><span wicket:id="commitAuthor">[commit author]</span></td>
                 <td class="message"><table class="nestedTable"><tr><td><span style="vertical-align:middle;" wicket:id="commitShortMessage">[commit short message]</span></td><td><div style="text-align:right;" wicket:id="commitRefs">[commit refs]</div></td></tr></table></td>
                 <td class="rightAlign">
                 <td class="hidden-phone rightAlign">
                     <span wicket:id="historyLinks">[history links]</span>
                </td>
               </tr>
src/com/gitblit/wicket/panels/LinkPanel.java
@@ -83,7 +83,7 @@
            WicketUtils.setCssClass(icon, bootstrapIcon);
            link.add(icon);
        }
        link.add(new Label("label", labelModel));
        link.add(new Label("label", labelModel).setRenderBodyOnly(true));
        add(link);
    }
src/com/gitblit/wicket/panels/LogPanel.html
@@ -12,11 +12,11 @@
    <table class="pretty">
        <tbody>
               <tr wicket:id="commit">
                 <td class="date"><span wicket:id="commitDate">[commit date]</span></td>
                 <td class="author"><span wicket:id="commitAuthor">[commit author]</span></td>
                 <td class="icon"><img wicket:id="commitIcon" /></td>
                 <td class="date" style="width:6em;"><span wicket:id="commitDate">[commit date]</span></td>
                 <td class="hidden-phone author"><span wicket:id="commitAuthor">[commit author]</span></td>
                 <td class="hidden-phone icon"><img wicket:id="commitIcon" /></td>
                 <td class="message"><table class="nestedTable"><tr><td><span style="vertical-align:middle;" wicket:id="commitShortMessage">[commit short message]</span></td><td><div style="text-align:right;" wicket:id="commitRefs">[commit refs]</div></td></tr></table></td>
                 <td class="rightAlign">
                 <td class="hidden-phone hidden-tablet rightAlign">
                     <span class="link">
                        <a wicket:id="view"><wicket:message key="gb.view"></wicket:message></a> | <a wicket:id="diff"><wicket:message key="gb.diff"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a>
                    </span>
src/com/gitblit/wicket/panels/RepositoriesPanel.html
@@ -42,12 +42,12 @@
                <img style="vertical-align: middle;" src="git-black-16x16.png"/>
                <wicket:message key="gb.repository">Repository</wicket:message>
            </th>
            <th wicket:id="orderByDescription"><wicket:message key="gb.description">Description</wicket:message></th>
            <th wicket:id="orderByOwner"><wicket:message key="gb.owner">Owner</wicket:message></th>
            <th></th>
            <th class="hidden-phone" wicket:id="orderByDescription"><wicket:message key="gb.description">Description</wicket:message></th>
            <th class="hidden-tablet hidden-phone" wicket:id="orderByOwner"><wicket:message key="gb.owner">Owner</wicket:message></th>
            <th class="hidden-phone"></th>
            <th wicket:id="orderByDate"><wicket:message key="gb.lastChange">Last Change</wicket:message></th>
            <th></th>
            <th class="right"></th>
            <th class="hidden-phone"></th>
            <th class="hidden-phone right"></th>
        </tr>
    </wicket:fragment>
    
@@ -57,12 +57,12 @@
                <img style="vertical-align: middle;" src="git-black-16x16.png"/>
                <wicket:message key="gb.repository">Repository</wicket:message>
            </th>
            <th><wicket:message key="gb.description">Description</wicket:message></th>
            <th><wicket:message key="gb.owner">Owner</wicket:message></th>
            <th></th>
            <th class="hidden-phone" ><span><wicket:message key="gb.description">Description</wicket:message></span></th>
            <th class="hidden-tablet hidden-phone"><span><wicket:message key="gb.owner">Owner</wicket:message></span></th>
            <th class="hidden-phone"></th>
            <th><wicket:message key="gb.lastChange">Last Change</wicket:message></th>
            <th></th>
            <th class="right"></th>
            <th class="hidden-phone"></th>
            <th class="hidden-phone right"></th>
        </tr>
    </wicket:fragment>
    
@@ -72,12 +72,12 @@
        
    <wicket:fragment wicket:id="repositoryRow">
        <td class="left" style="padding-left:3px;" ><b><span class="repositorySwatch" wicket:id="repositorySwatch"></span></b> <span style="padding-left:3px;" wicket:id="repositoryName">[repository name]</span></td>
        <td><div class="list" wicket:id="repositoryDescription">[repository description]</div></td>
        <td class="author"><span wicket:id="repositoryOwner">[repository owner]</span></td>
        <td style="text-align: right;padding-right:10px;"><img class="inlineIcon" wicket:id="ticketsIcon" /><img class="inlineIcon" wicket:id="docsIcon" /><img class="inlineIcon" wicket:id="frozenIcon" /><img class="inlineIcon" wicket:id="federatedIcon" /><img class="inlineIcon" wicket:id="accessRestrictionIcon" /></td>
        <td class="hidden-phone"><span class="list" wicket:id="repositoryDescription">[repository description]</span></td>
        <td class="hidden-tablet hidden-phone author"><span wicket:id="repositoryOwner">[repository owner]</span></td>
        <td class="hidden-phone" style="text-align: right;padding-right:10px;"><img class="inlineIcon" wicket:id="ticketsIcon" /><img class="inlineIcon" wicket:id="docsIcon" /><img class="inlineIcon" wicket:id="frozenIcon" /><img class="inlineIcon" wicket:id="federatedIcon" /><img class="inlineIcon" wicket:id="accessRestrictionIcon" /></td>
        <td><span wicket:id="repositoryLastChange">[last change]</span></td>
        <td style="text-align: right;padding-right:15px;"><span style="font-size:0.8em;" wicket:id="repositorySize">[repository size]</span></td>
        <td class="rightAlign">
        <td class="hidden-phone" style="text-align: right;padding-right:15px;"><span style="font-size:0.8em;" wicket:id="repositorySize">[repository size]</span></td>
        <td class="hidden-phone rightAlign">
            <span wicket:id="repositoryLinks"></span>
            <a style="text-decoration: none;" wicket:id="syndication">
                <img style="border:0px;vertical-align:middle;" src="feed_16x16.png"></img>
src/com/gitblit/wicket/panels/RepositoryUrlPanel.html
@@ -5,7 +5,7 @@
      lang="en"> 
<wicket:panel>
    <span wicket:id="repositoryUrl" style="color: blue;">[repository url]</span><span wicket:id="copyFunction"></span>
    <span wicket:id="repositoryUrl" style="color: blue;">[repository url]</span><span class="hidden-phone hidden-tablet" wicket:id="copyFunction"></span>
    
    <!-- Plain JavaScript manual copy & paste -->
    <wicket:fragment wicket:id="jsPanel">
src/com/gitblit/wicket/panels/TagsPanel.html
@@ -14,9 +14,9 @@
            <tr wicket:id="tag">
                <td class="date"><span wicket:id="tagDate">[tag date]</span></td>                
                <td><b><span wicket:id="tagName">[tag name]</span></b></td>
                <td class="icon"><img wicket:id="tagIcon" /></td>
                <td><span wicket:id="tagDescription">[tag description]</span></td>
                <td class="rightAlign">
                <td class="hidden-phone icon"><img wicket:id="tagIcon" /></td>
                <td class="hidden-phone"><span wicket:id="tagDescription">[tag description]</span></td>
                <td class="hidden-phone rightAlign">
                    <span wicket:id="tagLinks"></span>
                </td>
            </tr>
src/com/gitblit/wicket/panels/UsersPanel.html
@@ -15,19 +15,19 @@
                <img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="user_16x16.png"/>
                <wicket:message key="gb.users">[users]</wicket:message>
            </th>
            <th class="left"><wicket:message key="gb.displayName">[display name]</wicket:message></th>
            <th class="hidden-phone hidden-tablet left"><wicket:message key="gb.displayName">[display name]</wicket:message></th>
            <th style="width:120px;"><wicket:message key="gb.accessLevel">[access level]</wicket:message></th>
            <th style="width:140px;"><wicket:message key="gb.teamMemberships">[team memberships]</wicket:message></th>
            <th style="width:100px;"><wicket:message key="gb.repositories">[repositories]</wicket:message></th>
            <th class="hidden-phone" style="width:100px;"><wicket:message key="gb.repositories">[repositories]</wicket:message></th>
            <th style="width:80px;" class="right"></th>
        </tr>
        <tbody>        
               <tr wicket:id="userRow">
                   <td class="left" ><span class="list" wicket:id="username">[username]</span></td>
                   <td class="left" ><span class="list" wicket:id="displayName">[display name]</span></td>
                   <td class="hidden-phone hidden-tablet left" ><span class="list" wicket:id="displayName">[display name]</span></td>
                   <td class="left" ><span class="list" wicket:id="accesslevel">[access level]</span></td>
                   <td class="left" ><span class="list" wicket:id="teams">[team memberships]</span></td>
                   <td class="left" ><span class="list" wicket:id="repositories">[repositories]</span></td>
                   <td class="hidden-phone left" ><span class="list" wicket:id="repositories">[repositories]</span></td>
                   <td class="rightAlign"><span wicket:id="userLinks"></span></td>                  
               </tr>
        </tbody>