James Moger
2011-10-02 f762b160efd5cafd919a6fd7f9587f578eceb454
Merge branch 'master' into rpc
14 files added
53 files modified
2 files deleted
2265 ■■■■ changed files
NOTICE 8 ●●●●● patch | view | raw | blame | history
build.xml 12 ●●●● patch | view | raw | blame | history
distrib/gitblit.properties 9 ●●●● patch | view | raw | blame | history
docs/00_index.mkd 2 ●●●●● patch | view | raw | blame | history
docs/02_federation.mkd 2 ●●● patch | view | raw | blame | history
docs/04_design.mkd 1 ●●●● patch | view | raw | blame | history
docs/04_releases.mkd 2 ●●●●● patch | view | raw | blame | history
docs/doc_footer.html 4 ●●● patch | view | raw | blame | history
docs/doc_header.html 22 ●●●●● patch | view | raw | blame | history
docs/gitblit_logo_white.xcf patch | view | raw | blame | history
docs/site_footer.html 4 ●●● patch | view | raw | blame | history
docs/site_header.html 25 ●●●●● patch | view | raw | blame | history
resources/bootstrap.130.css 330 ●●●●● patch | view | raw | blame | history
resources/bootstrap.gb.css 758 ●●●●● patch | view | raw | blame | history
resources/gitblt2_white.png patch | view | raw | blame | history
resources/gitblt_25_white.png patch | view | raw | blame | history
resources/login.mkd 3 ●●●●● patch | view | raw | blame | history
resources/markdown.css 9 ●●●●● patch | view | raw | blame | history
src/com/gitblit/build/BuildSite.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/models/FederationModel.java 17 ●●●●● patch | view | raw | blame | history
src/com/gitblit/models/RepositoryModel.java 3 ●●●● patch | view | raw | blame | history
src/com/gitblit/utils/JGitUtils.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/utils/StringUtils.java 42 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/AuthorizationStrategy.java 12 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/GitBlitWebApp.java 10 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/GitBlitWebApp.properties 4 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/WicketUtils.java 10 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/BasePage.html 20 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/BasePage.java 20 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/BlamePage.html 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ChangePasswordPage.html 19 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ChangePasswordPage.java 12 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/EditRepositoryPage.html 22 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/EditRepositoryPage.java 7 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/EditUserPage.html 9 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/EditUserPage.java 13 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/FederationPage.html 17 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/FederationPage.java 52 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/FederationRegistrationPage.html 5 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/FederationRegistrationPage.java 15 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/LoginPage.html 36 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/LoginPage.java 118 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/MetricsPage.java 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RepositoriesPage.html 16 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RepositoriesPage.java 112 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RepositoryPage.html 42 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RepositoryPage.java 34 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ReviewProposalPage.html 7 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ReviewProposalPage.java 11 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RootPage.html 38 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RootPage.java 156 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RootSubPage.html 18 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RootSubPage.java 48 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/SendProposalPage.html 16 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/SendProposalPage.java 8 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/TicketPage.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/TicketPage.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/UsersPage.html 11 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/UsersPage.java 30 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/BranchesPanel.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/FederationProposalsPanel.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/FederationTokensPanel.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/LogPanel.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html 8 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/RepositoriesPanel.html 8 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/RepositoriesPanel.java 16 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/TagsPanel.html 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/UsersPanel.html 4 ●●●● patch | view | raw | blame | history
NOTICE
@@ -8,6 +8,14 @@
in this distribution or linked to by this distribution.
---------------------------------------------------------------------------
Bootstrap
---------------------------------------------------------------------------
   Bootstrap, released under the
   Apache Software License, Version 2.0.
   http://twitter.github.com/bootstrap
---------------------------------------------------------------------------
google-code-prettify
---------------------------------------------------------------------------
   google-code-prettify, released under the
build.xml
@@ -196,10 +196,10 @@
            <copy todir="${docs.output.dir}">
                <!-- Copy selected Gitblit resources -->
                <fileset dir="${project.resources.dir}">
                    <include name="background.png" />
                    <include name="gitblit.css" />
                    <include name="bootstrap.130.css" />
                    <include name="bootstrap.gb.css" />
                    <include name="markdown.css" />
                    <include name="gitblt_25.png" />
                    <include name="gitblt_25_white.png" />
                    <include name="gitblt-favicon.png" />
                    <include name="lock_go_16x16.png" />
                    <include name="lock_pull_16x16.png" />
@@ -425,10 +425,10 @@
        <copy todir="${project.site.dir}">
            <!-- Copy selected Gitblit resources -->
            <fileset dir="${project.resources.dir}">
                <include name="background.png" />
                <include name="gitblit.css" />
                <include name="bootstrap.130.css" />
                <include name="bootstrap.gb.css" />
                <include name="markdown.css" />
                <include name="gitblt_25.png" />
                <include name="gitblt_25_white.png" />
                <include name="gitblt-favicon.png" />
                <include name="lock_go_16x16.png" />
                <include name="lock_pull_16x16.png" />
distrib/gitblit.properties
@@ -116,7 +116,14 @@
# SINCE 0.6.0
web.showFederationRegistrations = false
# This is the message display above the repositories table.
# This is the message displayed when *web.authenticateViewPages=true*.
# This can point to a file with Markdown content.
# Specifying "gitblit" uses the internal login message.
#
# SINCE 0.6.1
web.loginMessage = gitblit
# This is the message displayed above the repositories table.
# This can point to a file with Markdown content.
# Specifying "gitblit" uses the internal welcome message.
#
docs/00_index.mkd
@@ -28,6 +28,8 @@
**%VERSION%** ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)|[fedclient](http://code.google.com/p/gitblit/downloads/detail?name=%FEDCLIENT%)) based on [%JGIT%][jgit] &nbsp; *released %BUILDDATE%*
- improved: updated ui with Twitter's Bootstrap CSS toolkit
<br/>**New:** *web.loginMessage = gitblit*
- fixed: Null pointer exception if did not set federation strategy (issue 20)
- fixed: Gitblit GO allows SSL renegotiation if running on Java 1.6.0_22 or later
- added: IUserService.setup(IStoredSettings) for custom user service implementations
docs/02_federation.mkd
@@ -175,7 +175,7 @@
## Federation Pull Registration Keys
<table class="text">
<table>
<tr><th>federation.N.url</th>
<td>string</td>
<td>the url of the origin Gitblit instance *(required)*</td>
docs/04_design.mkd
@@ -10,6 +10,7 @@
### Bundled Dependencies
The following dependencies are bundled with Gitblit.
- [Bootstrap](http://twitter.github.com/bootstrap) (Apache 2.0)
- [google-code-prettify](http://code.google.com/p/google-code-prettify) (Apache 2.0)
- [Commons Daemon](http://commons.apache.org/daemon) (Apache 2.0)
- magnifying glass search icon courtesy of [Gnome](http://gnome.org) (Creative Commons CC-BY)
docs/04_releases.mkd
@@ -3,6 +3,8 @@
### Current Release
**%VERSION%** ([go](http://code.google.com/p/gitblit/downloads/detail?name=%GO%)|[war](http://code.google.com/p/gitblit/downloads/detail?name=%WAR%)|[fedclient](http://code.google.com/p/gitblit/downloads/detail?name=%FEDCLIENT%)) based on [%JGIT%][jgit] &nbsp; *released %BUILDDATE%*
- improved: updated ui with Twitter's Bootstrap CSS toolkit
<br/>**New:** *web.loginMessage = gitblit*
- fixed: Null pointer exception if did not set federation strategy (issue 20)
- fixed: Gitblit GO allows SSL renegotiation if running on Java 1.6.0_22 or later
- added: IUserService.setup(IStoredSettings) for custom user service implementations
docs/doc_footer.html
@@ -1,7 +1,9 @@
    </div>
            </div> <!-- markdown -->
    <div style="margin-top:10px" class="page_footer">
        <div style="float:right;">{0}</div>
    The content of this page is licensed under the <a href="http://creativecommons.org/licenses/by/3.0">Creative Commons Attribution 3.0 License</a>.
    </div>
        </div> <!-- content -->
    </div> <!-- container -->
</body>
</html>
docs/doc_header.html
@@ -2,7 +2,8 @@
<html>
    <head>
        <title>Gitblit</title>
        <link rel="stylesheet" type="text/css" href="./gitblit.css"/>
        <link rel="stylesheet" type="text/css" href="./bootstrap.130.css"/>
        <link rel="stylesheet" type="text/css" href="./bootstrap.gb.css"/>
        <link rel="stylesheet" type="text/css" href="./markdown.css"/>
        <link rel="shortcut icon" type="image/png" href="./gitblt-favicon.png" />
        <meta name="ROBOTS" content="INDEX, NOFOLLOW">
@@ -28,12 +29,19 @@
        <script type="text/javascript" src="prettify/prettify.js"></script>
        <link href="prettify/prettify.css" type="text/css" rel="stylesheet" />        
    </head>
    <body style="width:900px"  onload="prettyPrint()">
        <div class="page_header">
            <a title="gitblit homepage" href="http://gitblit.com/">
                <img src="./gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
    <body style="padding-top:40px;"  onload="prettyPrint()">
        <div class="topbar">
            <div class="fill">
                <div class="container">
                    <a class="brand" href="http://gitblit.com" title="gitblit homepage">
                        <img src="gitblt_25_white.png" width="79" height="25" alt="gitblit" class="logo"/>
            </a>
            <span style="color:black;">{0}</span>
                    <ul class="nav">
                        {1}
                    </ul>
        </div>
        <div class="page_nav">{1}</div>
            </div>
        </div>
        <div class="container">
            <div class="content">
        <div class="markdown">
docs/gitblit_logo_white.xcf
Binary files differ
docs/site_footer.html
@@ -1,7 +1,9 @@
    </div>
            </div> <!-- markdown -->
    <div style="margin-top:10px" class="page_footer">
        <div style="float:right;">{0}</div>
    The content of this page is licensed under the <a href="http://creativecommons.org/licenses/by/3.0">Creative Commons Attribution 3.0 License</a>.
    </div>
        </div> <!-- content -->
    </div> <!-- container -->
</body>
</html>
docs/site_header.html
@@ -2,7 +2,8 @@
<html>
    <head>
        <title>Gitblit</title>
        <link rel="stylesheet" type="text/css" href="./gitblit.css"/>
        <link rel="stylesheet" type="text/css" href="./bootstrap.130.css"/>
        <link rel="stylesheet" type="text/css" href="./bootstrap.gb.css"/>
        <link rel="stylesheet" type="text/css" href="./markdown.css"/>
        <link rel="shortcut icon" type="image/png" href="./gitblt-favicon.png" />
        <meta name="ROBOTS" content="INDEX">
@@ -33,15 +34,23 @@
        
        <!-- ANALYTICS -->
    </head>
    <body style="width:900px"  onload="prettyPrint()">
        <a href="http://github.com/gitblit"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://d3nwyuy0nl342s.cloudfront.net/img/30f550e0d38ceb6ef5b81500c64d970b7fb0f028/687474703a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub"></a>
        <div class="page_header">
            <a title="gitblit homepage" href="http://gitblit.com/">
                <img src="./gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
    <body style="padding-top:40px;"  onload="prettyPrint()">
        <div class="topbar">
            <div class="fill">
                <div class="container">
                    <a class="brand" href="http://gitblit.com" title="gitblit homepage">
                        <img src="gitblt_25_white.png" width="79" height="25" alt="gitblit" class="logo"/>
            </a>
            <span style="color:black;">{0}</span>
            <!-- Google Plus One -->
            <g:plusone></g:plusone>
                    <ul class="nav">
                        {1}
                    </ul>
        </div>
        <div class="page_nav">{1}</div>
            </div>
        </div>
        <div class="container">
            <div class="content">
        <div class="markdown">
resources/bootstrap.130.css
New file
@@ -0,0 +1,330 @@
html,body{margin:0;padding:0;}
h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;}
table{border-collapse:collapse;border-spacing:0;}
ol,ul{list-style:none;}
q:before,q:after,blockquote:before,blockquote:after{content:"";}
html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
a:focus{outline:thin dotted;}
a:hover,a:active{outline:0;}
article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
audio:not([controls]){display:none;}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}
sup{top:-0.5em;}
sub{bottom:-0.25em;}
img{border:0;-ms-interpolation-mode:bicubic;}
button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;}
button,input{line-height:normal;*overflow:visible;}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}
button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}
textarea{overflow:auto;vertical-align:top;}
html,body{background-color:#ffffff;}
body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;color:#404040;}
.container{width:940px;margin-left:auto;margin-right:auto;zoom:1;}.container:before,.container:after{display:table;content:"";zoom:1;*display:inline;}
.container:after{clear:both;}
.container-fluid{position:relative;min-width:940px;padding-left:20px;padding-right:20px;zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";zoom:1;*display:inline;}
.container-fluid:after{clear:both;}
.container-fluid>.sidebar{float:left;width:220px;}
.container-fluid>.content{margin-left:240px;}
a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;}
.pull-right{float:right;}
.pull-left{float:left;}
.hide{display:none;}
.show{display:block;}
.row{zoom:1;margin-left:-20px;}.row:before,.row:after{display:table;content:"";zoom:1;*display:inline;}
.row:after{clear:both;}
[class*="span"]{display:inline;float:left;margin-left:20px;}
.span1{width:40px;}
.span2{width:100px;}
.span3{width:160px;}
.span4{width:220px;}
.span5{width:280px;}
.span6{width:340px;}
.span7{width:400px;}
.span8{width:460px;}
.span9{width:520px;}
.span10{width:580px;}
.span11{width:640px;}
.span12{width:700px;}
.span13{width:760px;}
.span14{width:820px;}
.span15{width:880px;}
.span16{width:940px;}
.span17{width:1000px;}
.span18{width:1060px;}
.span19{width:1120px;}
.span20{width:1180px;}
.span21{width:1240px;}
.span22{width:1300px;}
.span23{width:1360px;}
.span24{width:1420px;}
.offset1{margin-left:80px;}
.offset2{margin-left:140px;}
.offset3{margin-left:200px;}
.offset4{margin-left:260px;}
.offset5{margin-left:320px;}
.offset6{margin-left:380px;}
.offset7{margin-left:440px;}
.offset8{margin-left:500px;}
.offset9{margin-left:560px;}
.offset10{margin-left:620px;}
.offset11{margin-left:680px;}
.offset12{margin-left:740px;}
.span-one-third{width:300px;}
.span-two-thirds{width:620px;}
.offset-one-third{margin-left:340px;}
.offset-two-thirds{margin-left:660px;}
p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;}
h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;}
h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;}
h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;}
h3,h4,h5,h6{line-height:36px;}
h3{font-size:18px;}h3 small{font-size:14px;}
h4{font-size:16px;}h4 small{font-size:12px;}
h5{font-size:14px;}
h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;}
ul,ol{margin:0 0 18px 25px;}
ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
ul{list-style:disc;}
ol{list-style:decimal;}
li{line-height:18px;color:#808080;}
ul.unstyled{list-style:none;margin-left:0;}
dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;}
dl dt{font-weight:bold;}
dl dd{margin-left:9px;}
hr{margin:20px 0 19px;border:0;border-bottom:1px solid #eee;}
strong{font-style:inherit;font-weight:bold;}
em{font-style:italic;font-weight:inherit;line-height:inherit;}
.muted{color:#bfbfbf;}
blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;}
blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';}
address{display:block;line-height:18px;margin-bottom:18px;}
code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;}
pre{background-color:#f5f5f5;display:block;padding:8.5px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;}
form{margin-bottom:18px;}
fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;padding-left:150px;font-size:19.5px;line-height:1;color:#404040;*padding:0 0 5px 145px;*line-height:1.5;}
form .clearfix{margin-bottom:18px;zoom:1;}form .clearfix:before,form .clearfix:after{display:table;content:"";zoom:1;*display:inline;}
form .clearfix:after{clear:both;}
label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;}
label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;}
form .input{margin-left:150px;}
input[type=checkbox],input[type=radio]{cursor:pointer;}
input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;font-size:13px;line-height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:none;}
input[type=file]{background-color:#ffffff;padding:initial;border:initial;line-height:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;}
select,input[type=file]{height:27px;line-height:27px;*margin-top:4px;}
select[multiple]{height:inherit;}
textarea{height:auto;}
.uneditable-input{background-color:#ffffff;display:block;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
:-moz-placeholder{color:#bfbfbf;}
::-webkit-input-placeholder{color:#bfbfbf;}
input,textarea{-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);}
input:focus,textarea:focus{outline:0;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);}
input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:1px dotted #666;}
form div.clearfix.error{background:#fae5e3;padding:10px 0;margin:-10px 0 10px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}form div.clearfix.error>label,form div.clearfix.error span.help-inline,form div.clearfix.error span.help-block{color:#9d261d;}
form div.clearfix.error input,form div.clearfix.error textarea{border-color:#c87872;-webkit-box-shadow:0 0 3px rgba(171, 41, 32, 0.25);-moz-box-shadow:0 0 3px rgba(171, 41, 32, 0.25);box-shadow:0 0 3px rgba(171, 41, 32, 0.25);}form div.clearfix.error input:focus,form div.clearfix.error textarea:focus{border-color:#b9554d;-webkit-box-shadow:0 0 6px rgba(171, 41, 32, 0.5);-moz-box-shadow:0 0 6px rgba(171, 41, 32, 0.5);box-shadow:0 0 6px rgba(171, 41, 32, 0.5);}
form div.clearfix.error .input-prepend span.add-on,form div.clearfix.error .input-append span.add-on{background:#f4c8c5;border-color:#c87872;color:#b9554d;}
.input-mini,input.mini,textarea.mini,select.mini{width:60px;}
.input-small,input.small,textarea.small,select.small{width:90px;}
.input-medium,input.medium,textarea.medium,select.medium{width:150px;}
.input-large,input.large,textarea.large,select.large{width:210px;}
.input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;}
.input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;}
textarea.xxlarge{overflow-y:auto;}
input.span1,textarea.span1,select.span1{display:inline-block;float:none;width:30px;margin-left:0;}
input.span2,textarea.span2,select.span2{display:inline-block;float:none;width:90px;margin-left:0;}
input.span3,textarea.span3,select.span3{display:inline-block;float:none;width:150px;margin-left:0;}
input.span4,textarea.span4,select.span4{display:inline-block;float:none;width:210px;margin-left:0;}
input.span5,textarea.span5,select.span5{display:inline-block;float:none;width:270px;margin-left:0;}
input.span6,textarea.span6,select.span6{display:inline-block;float:none;width:330px;margin-left:0;}
input.span7,textarea.span7,select.span7{display:inline-block;float:none;width:390px;margin-left:0;}
input.span8,textarea.span8,select.span8{display:inline-block;float:none;width:450px;margin-left:0;}
input.span9,textarea.span9,select.span9{display:inline-block;float:none;width:510px;margin-left:0;}
input.span10,textarea.span10,select.span10{display:inline-block;float:none;width:570px;margin-left:0;}
input.span11,textarea.span11,select.span11{display:inline-block;float:none;width:630px;margin-left:0;}
input.span12,textarea.span12,select.span12{display:inline-block;float:none;width:690px;margin-left:0;}
input.span13,textarea.span13,select.span13{display:inline-block;float:none;width:750px;margin-left:0;}
input.span14,textarea.span14,select.span14{display:inline-block;float:none;width:810px;margin-left:0;}
input.span15,textarea.span15,select.span15{display:inline-block;float:none;width:870px;margin-left:0;}
input.span16,textarea.span16,select.span16{display:inline-block;float:none;width:930px;margin-left:0;}
input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
.actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;}
.help-inline,.help-block{font-size:11px;line-height:18px;color:#bfbfbf;}
.help-inline{padding-left:5px;*position:relative;*top:-5px;}
.help-block{display:block;max-width:600px;}
.inline-inputs{color:#808080;}.inline-inputs span,.inline-inputs input{display:inline-block;}
.inline-inputs input.mini{width:60px;}
.inline-inputs input.small{width:90px;}
.inline-inputs span{padding:0 2px 0 1px;}
.input-prepend input,.input-append input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
.input-prepend .add-on,.input-append .add-on{position:relative;background:#f5f5f5;border:1px solid #ccc;z-index:2;float:left;display:block;width:auto;min-width:16px;height:18px;padding:4px 4px 4px 5px;margin-right:-1px;font-weight:normal;line-height:18px;color:#bfbfbf;text-align:center;text-shadow:0 1px 0 #ffffff;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
.input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;}
.input-prepend .add-on{*margin-top:1px;}
.input-append input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
.input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin-right:0;margin-left:-1px;}
.inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;}
.inputs-list label{display:block;float:none;width:auto;padding:0;line-height:18px;text-align:left;white-space:normal;}.inputs-list label strong{color:#808080;}
.inputs-list label small{font-size:11px;font-weight:normal;}
.inputs-list .inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;}
.inputs-list:first-child{padding-top:6px;}
.inputs-list li+li{padding-top:2px;}
.inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;}
.form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;}
.form-stacked legend{padding-left:0;}
.form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;}
.form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;}
.form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;}
.form-stacked div.clearfix.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;}
.form-stacked .actions{margin-left:-20px;padding-left:20px;}
table{width:100%;margin-bottom:18px;padding:0;border-collapse:separate;*border-collapse:collapse;font-size:13px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}table th,table td{padding:10px 10px 9px;line-height:18px;text-align:left;}
table th{padding-top:9px;font-weight:bold;vertical-align:middle;border-bottom:1px solid #ddd;}
table td{vertical-align:top;}
table th+th,table td+td{border-left:1px solid #ddd;}
table tr+tr td{border-top:1px solid #ddd;}
table tbody tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
table tbody tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
table tbody tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
table tbody tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
.zebra-striped tbody tr:nth-child(odd) td{background-color:#f9f9f9;}
.zebra-striped tbody tr:hover td{background-color:#f5f5f5;}
table .header{cursor:pointer;}table .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;}
table .headerSortUp,table .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);}
table .header:hover:after{visibility:visible;}
table .headerSortDown:after,table .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;}
table .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;}
table .blue{color:#049cdb;border-bottom-color:#049cdb;}
table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;}
table .green{color:#46a546;border-bottom-color:#46a546;}
table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;}
table .red{color:#9d261d;border-bottom-color:#9d261d;}
table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;}
table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;}
table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;}
table .orange{color:#f89406;border-bottom-color:#f89406;}
table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;}
table .purple{color:#7a43b6;border-bottom-color:#7a43b6;}
table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;}
.topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
.topbar h3 a:hover,.topbar .brand a:hover,.topbar ul .active>a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;}
.topbar h3{position:relative;}
.topbar h3 a,.topbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;}
.topbar p{margin:0;line-height:40px;}.topbar p a:hover{background-color:transparent;color:#ffffff;}
.topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;}
.topbar form.pull-right{float:right;}
.topbar input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;padding:4px 9px;color:#ffffff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.topbar input:-moz-placeholder{color:#e6e6e6;}
.topbar input::-webkit-input-placeholder{color:#e6e6e6;}
.topbar input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#ffffff;}
.topbar input:focus,.topbar input.focused{outline:0;background-color:#ffffff;color:#404040;text-shadow:0 1px 0 #ffffff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);}
.topbar-inner,.topbar .fill{background-color:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
.topbar div>ul,.nav{display:block;float:left;margin:0 10px 0 0;position:relative;left:0;}.topbar div>ul>li,.nav>li{display:block;float:left;}
.topbar div>ul a,.nav a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar div>ul a:hover,.nav a:hover{color:#ffffff;text-decoration:none;}
.topbar div>ul .active>a,.nav .active>a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);}
.topbar div>ul.secondary-nav,.nav.secondary-nav{float:right;margin-left:10px;margin-right:0;}.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu{right:0;border:0;}
.topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle{background:#444;background:rgba(255, 255, 255, 0.05);}
.topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu{background-color:#333;}.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle{color:#ffffff;}.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open{background:#444;background:rgba(255, 255, 255, 0.05);}
.topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a{color:#999;text-shadow:0 1px 0 rgba(0, 0, 0, 0.5);}.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover{background-color:#191919;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));background-image:-moz-linear-gradient(top, #292929, #191919);background-image:-ms-linear-gradient(top, #292929, #191919);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));background-image:-webkit-linear-gradient(top, #292929, #191919);background-image:-o-linear-gradient(top, #292929, #191919);background-image:linear-gradient(top, #292929, #191919);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);color:#ffffff;}
.topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a{color:#ffffff;}
.topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider{background-color:#222;border-color:#444;}
.topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a{padding:4px 15px;}
li.menu,.dropdown{position:relative;}
a.menu:after,.dropdown-toggle:after{width:0;height:0;display:inline-block;content:"&darr;";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;}
.menu-dropdown,.dropdown-menu{background-color:#ffffff;float:left;display:none;position:absolute;top:40px;z-index:900;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:6px 0;zoom:1;border-color:#999;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:0 1px 1px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.menu-dropdown li,.dropdown-menu li{float:none;display:block;background-color:none;}
.menu-dropdown .divider,.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#eee;border-bottom:1px solid #ffffff;}
.topbar .dropdown-menu a,.dropdown-menu a{display:block;padding:4px 15px;clear:both;font-weight:normal;line-height:18px;color:#808080;text-shadow:0 1px 0 #ffffff;}.topbar .dropdown-menu a:hover,.dropdown-menu a:hover{background-color:#dddddd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));background-image:-moz-linear-gradient(top, #eeeeee, #dddddd);background-image:-ms-linear-gradient(top, #eeeeee, #dddddd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eeeeee, #dddddd);background-image:-o-linear-gradient(top, #eeeeee, #dddddd);background-image:linear-gradient(top, #eeeeee, #dddddd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);color:#404040;text-decoration:none;-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);}
.open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
.open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu{display:block;}
.tabs,.pills{margin:0 0 20px;padding:0;list-style:none;zoom:1;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";zoom:1;*display:inline;}
.tabs:after,.pills:after{clear:both;}
.tabs>li,.pills>li{float:left;}.tabs>li>a,.pills>li>a{display:block;}
.tabs{float:left;width:100%;border-bottom:1px solid #ddd;}.tabs>li{position:relative;top:1px;}.tabs>li>a{padding:0 15px;margin-right:2px;line-height:36px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.tabs>li>a:hover{text-decoration:none;background-color:#eee;border-color:#eee #eee #ddd;}
.tabs>li.active>a{color:#808080;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;}
.tabs .menu-dropdown,.tabs .dropdown-menu{top:35px;border-width:1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
.tabs a.menu:after,.tabs .dropdown-toggle:after{border-top-color:#999;margin-top:15px;margin-left:5px;}
.tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle{border-color:#999;}
.tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after{border-top-color:#555;}
.tab-content{clear:both;}
.pills a{margin:5px 3px 5px 0;padding:0 15px;text-shadow:0 1px 1px #ffffff;line-height:30px;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills a:hover{background:#00438a;color:#ffffff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);}
.pills .active a{background:#0069d6;color:#ffffff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);}
.tab-content>*,.pill-content>*{display:none;}
.tab-content>.active,.pill-content>.active{display:block;}
.breadcrumb{margin:0 0 18px;padding:7px 14px;background-color:#f5f5f5;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;}
.breadcrumb .divider{padding:0 5px;color:#bfbfbf;}
.breadcrumb .active a{color:#404040;}
.hero-unit{background-color:#f5f5f5;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
.hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;}
.page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;}
.btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;}
.btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;}
.btn:focus{outline:1px dotted #666;}
.btn.primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn:active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);}
.btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
.btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
.btn.large{font-size:15px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
.btn.small{padding:7px 9px 7px;font-size:11px;}
:root .alert-message,:root .btn{border-radius:0 \0;}
button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;}
.close{float:right;color:#000000;font-size:20px;font-weight:bold;line-height:13.5px;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=20);-khtml-opacity:0.2;-moz-opacity:0.2;opacity:0.2;}.close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;}
.alert-message{position:relative;padding:7px 15px;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message .close{*margin-top:3px;}
.alert-message h5{line-height:18px;}
.alert-message p{margin-bottom:0;}
.alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;}
.alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);}
.alert-message.block-message{background-image:none;background-color:#fdf5d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message ul,.alert-message.block-message p{margin-right:30px;}
.alert-message.block-message ul{margin-bottom:0;}
.alert-message.block-message li{color:#404040;}
.alert-message.block-message .alert-actions{margin-top:5px;}
.alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
.alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;}
.alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;}
.alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;}
.pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
.pagination li{display:inline;}
.pagination a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;}
.pagination a:hover,.pagination .active a{background-color:#c7eefe;}
.pagination .disabled a,.pagination .disabled a:hover{background-color:transparent;color:#bfbfbf;}
.pagination .next a{border:0;}
.well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-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);}
.modal-backdrop{background-color:#000000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;}.modal-backdrop.fade{opacity:0;}
.modal-backdrop,.modal-backdrop.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}
.modal{position:fixed;top:50%;left:50%;z-index:11000;width:560px;margin:-250px 0 0 -250px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .close{margin-top:7px;}
.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
.modal.fade.in{top:50%;}
.modal-header{border-bottom:1px solid #eee;padding:5px 15px;}
.modal-body{padding:15px;}
.modal-footer{background-color:#f5f5f5;padding:14px 15px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:0;}.modal-footer:before,.modal-footer:after{display:table;content:"";zoom:1;*display:inline;}
.modal-footer:after{clear:both;}
.modal-footer .btn{float:right;margin-left:5px;}
.twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}
.twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
.twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
.twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
.twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
.twipsy-inner{padding:3px 8px;background-color:#000000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
.twipsy-arrow{position:absolute;width:0;height:0;}
.popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
.popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
.popover .arrow{position:absolute;width:0;height:0;}
.popover .inner{background-color:#000000;background-color:rgba(0, 0, 0, 0.8);padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
.popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;}
.popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;}
.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
.label{padding:1px 3px 2px;background-color:#bfbfbf;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;}
.label.warning{background-color:#f89406;}
.label.success{background-color:#46a546;}
.label.notice{background-color:#62cffc;}
.media-grid{margin-left:-20px;margin-bottom:0;zoom:1;}.media-grid:before,.media-grid:after{display:table;content:"";zoom:1;*display:inline;}
.media-grid:after{clear:both;}
.media-grid li{display:inline;}
.media-grid a{float:left;padding:4px;margin:0 0 20px 20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}.media-grid a img{display:block;}
.media-grid a:hover{border-color:#0069d6;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
resources/bootstrap.gb.css
New file
@@ -0,0 +1,758 @@
body, input, select {
    color: #202020;
}
ul, ol {
    margin-bottom: 10px !important;
}
hr {
    margin-top: 10px;
    margin-bottom: 10px;
}
.page-header h1, .page-header h2 {
    color: #0069D6;
}
.topbar {
    height:40px !important;
}
.topbar a {
      color: white;
    text-shadow: none;
}
.nav a:hover {
    color: #abd4ff !important;
}
.topbar-inner,.topbar .fill{
    height:40px !important;
    background-color:#000050;
    background-repeat:repeat-x;
    background-image:-khtml-gradient(linear, left top, left bottom, from(#000060), to(#000040));
    background-image:-moz-linear-gradient(top, #000060, #000040);
    background-image:-ms-linear-gradient(top, #000060, #000040);
    background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #000060), color-stop(100%, #000040));
    background-image:-webkit-linear-gradient(top, #000060, #000040);
    background-image:-o-linear-gradient(top, #000060, #000040);
    background-image:linear-gradient(top, #000060, #000040);
    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#000060', endColorstr='#000040', GradientType=0);
    -webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
    -moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
    box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);
    border-bottom: 2px solid #ff9900 !important;
}
.breadcrumb {
    margin-top: 5px !important;
    margin-bottom: 5px !important;
}
.page-header {
    margin-bottom: 5px;
}
.page-header h2 small {
    font-size: 80%;
    font-weight: bold;
}
div.page_footer {
    clear: both;
    height: 17px;
    color: black;
    background-color: #ffffff;
    padding: 5px;
    border-top: 1px solid #bbb;
    font-style: italic;
}
pre, code, pre.prettyprint, pre.plainprint {
    background-color: #ffffff;
    color: black;
    font-family: monospace;
    font-size:12px;
    border:0px;
    padding: 0;
    line-height: 1.35em;
}
table {
    margin-bottom:5px !important;
}
pre.prettyprint ol {
    padding-left:25px;
}
.age0, .age1, .age2 {
    font-size: 12px;
}
/* age0: age < 60*60*2 */
.age0 {
    color: #008000;
    font-style: italic;
    font-weight: bold;
}
/* age1: 60*60*2 <= age < 60*60*24*2 */
.age1 {
    color: #008000;
    font-style: italic;
}
/* age2: 60*60*24*2 <= age */
.age2 {
    font-style: italic;
}
a.list {
    text-decoration: none;
    color: inherit;
}
a.list.subject {
    font-weight: bold;
}
a.list.name {
    font-weight: bold;
}
a.list:hover {
    text-decoration: underline;
    color: #880000;
}
span.empty {
    font-size: 0.9em;
    font-style: italic;
    padding-left:10px;
    color: #008000;
}
span.link {
    color: #888;
}
span.link, span.link a {
    font-family: sans-serif;
    font-size: 11px;
}
span.link em, div.link span em {
    font-style: normal;
    font-family: sans-serif;
    font-size: 11px;
}
img.inlineIcon {
    padding-left: 1px;
    padding-right: 1px;
}
img.overview {
    float:right;
    border:1px solid #CCCCCC;
}
div.header, div.commitHeader, table.repositories th {
    background-color:#e0e0e0;
    background-repeat:repeat-x;
    background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#e0e0e0));
    background-image:-moz-linear-gradient(top, #ffffff, #e0e0e0);
    background-image:-ms-linear-gradient(top, #ffffff, #e0e0e0);
    background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #e0e0e0));
    background-image:-webkit-linear-gradient(top, #ffffff, #e0e0e0);
    background-image:-o-linear-gradient(top, #ffffff, #e0e0e0);
    background-image:linear-gradient(top, #ffffff, #e0e0e0);
    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e0e0e0', GradientType=0);
    -webkit-box-shadow:inset 0 1px 0 #ffffff;
    -moz-box-shadow:inset 0 1px 0 #ffffff;
    box-shadow:inset 0 1px 0 #ffffff;
}
div.header {
    padding: 3px;
    border: 1px solid #ddd;
    border-bottom: 0;
    border-radius: 3px 3px 0 0;
}
div.commitHeader {
    margin:0 0 2px;
    padding:7px 14px;
    border:1px solid #ddd;
    border-radius: 3px;
    -webkit-border-radius:3px;
    -moz-border-radius:3px;border-radius:3px;
}
div.header a, div.commitHeader a {
    color: black;
    text-decoration: none;
    font-weight: bold;
}
div.header a:hover, div.commitHeader a:hover {
    text-decoration: underline;
}
div.page_nav2 {
    padding: 2px 5px 7px 5px;
}
div.admin_nav {
    border-bottom: 0px;
    text-align: right;
    padding: 5px 5px 5px 2px;
}
div.admin_nav a {
    text-decoration: none;
}
div.admin_nav a:hover {
    text-decoration: underline;
}
div.search {
    height: 40px;
    padding-top:2px;
}
div.search input {
    -webkit-border-radius:0;-moz-border-radius:0x;border-radius:0;
    vertical-align: top;
    background: url(search-icon.png) no-repeat 4px center;
    background-color: transparent;
    border: 1px solid transparent;
    outline: none;
    padding: 2px 2px 2px 22px;
    text-shadow: none;
    margin: 0px;
    color: #ddd;
}
div.search input:hover, div.search input:focus {
    background-color: transparent;
    border: 1px solid transparent;
    padding: 2px 2px 2px 22px;
    text-shadow: none;
    color: #ddd;
    border-bottom: 1px solid #ff9900;
}
div.search input:focus {
    color: white;
}
/* div.search input:focused { */
/*     background-color: transparent; */
/*     border: 1px solid transparent; */
/*     padding: 2px 2px 2px 22px; */
/*     text-shadow: none; */
/* } */
div.login input:focus {
    background-color: rgba(255, 255, 255, 0.6);
    text-shadow: none;
    color: white;
}
div.commit_message {
    font-family: monospace;
    padding: 8px;
    border: solid #ccc;
    border-width: 1px 0px 0px;
}
div.commit_message a {
    font-family: monospace;
}
div.bug_open, span.bug_open {
    padding: 2px;
    background-color: #803333;
    color: white;
    text-align: center;
}
div.bug_resolved, span.bug_resolved {
    padding: 2px;
    background-color: #408040;
    color: white;
    text-align: center;
}
div.bug_invalid, span.bug_invalid {
    padding: 2px;
    background-color: gray;
    text-align: center;
}
div.bug_hold, span.bug_hold {
    padding: 2px;
    background-color: orange;
    text-align: center;
}
div.diff {
    font-family: monospace;
    overflow: auto;
}
div.diff.header {
    -moz-border-bottom-colors: none;
    -moz-border-image: none;
    -moz-border-left-colors: none;
    -moz-border-right-colors: none;
    -moz-border-top-colors: none;
    background-color: #EDECE6;
    border-color: #D9D8D1;
    border-style: solid;
    border-width: 1px;
    font-weight: bold;
    margin-top: 10px;
    padding: 4px 0 2px;
}
div.diff.extended_header {
    background-color: #F6F5EE;
    padding: 2px 0;
    font-family: inherit;
}
span.diff.add {
    color: #008800;
    font-family: inherit;
}
span.diff.remove {
    color: #FFDDDD;
    font-family: inherit;
}
span.diff.unchanged {
    color: inherit;
    font-family: inherit;
}
div.diff.hunk_header {
    -moz-border-bottom-colors: none;
    -moz-border-image: none;
    -moz-border-left-colors: none;
    -moz-border-right-colors: none;
    -moz-border-top-colors: none;
    border-color: #FFE0FF;
    border-style: dotted;
    border-width: 1px 0 0;
    margin-top: 2px;
    font-family: inherit;
}
span.diff.hunk_info {
    background-color: #FFEEFF;
    color: #990099;
    font-family: inherit;
}
span.diff.hunk_section {
    color: #AA22AA;
    font-family: inherit;
}
div.diff.add2 {
    background-color: #DDFFDD;
    font-family: inherit;
}
div.diff.remove2 {
    background-color: #FFDDDD;
    font-family: inherit;
}
div.diff table {
    border-radius: 0;
    border-right: 1px solid #bbb;
    border-bottom: 1px solid #bbb;
    width: 100%;
}
div.diff table th, div.diff table td {
    margin: 0px;
    padding: 0px;
    font-family: monospace;
    border: 0;
}
div.diff table th {
    background-color: #f0f0f0;
    text-align: center;
    color: #999;
    padding-left: 5px;
    padding-right: 5px;
    width: 30px;
}
div.diff table th.header {
    background-color: #D2C3AF;
    border-right: 0px;
    border-bottom: 1px solid #808080;
    font-family: inherit;
    font-size:0.9em;
    color: black;
    padding: 2px;
    text-align: left;
}
div.diff table td.hunk_header {
    background-color: #dAe2e5 !important;
    border-top: 1px solid #bac2c5;
    border-bottom: 1px solid #bac2c5;
    color: #555;
}
div.diff table td {
    border-left: 1px solid #bbb;
    background-color: #f5f5f5;
}
td.changeType {
    width: 15px;
}
span.addition, span.modification, span.deletion, span.rename {
    border: 1px solid #888;
    float: left;
    height: 0.8em;
    margin: 0.2em 0.5em 0 0;
    overflow: hidden;
    width: 0.8em;
}
span.addition {
    background-color: #ccffcc;
}
span.modification {
    background-color: #ffdd88;
}
span.deletion {
    background-color: #f8bbbb;
}
span.rename {
    background-color: #cAc2f5;
}
div.commitLegend {
    float: right;
    padding: 0.4em 0.4em 0.2em 0.4em;
    vertical-align:top;
    margin: 0px;
}
div.commitLegend span {
    font-size: 0.9em;
    vertical-align: top;
}
div.references {
    float: right;
    text-align: right;
}
table.plain {
    width: 0 !important;
    border: 0;
}
table.plain th, table.plain td {
    white-space: nowrap;
    padding: 1px 6px;
    border: 0;
}
table.pretty {
    border-radius: 0 0 3px 3px;
}
table.pretty td.icon {
    padding: 0px 0px 0px 2px;
    width: 18px;
    vertical-align: middle;
}
table.pretty td.icon img {
    vertical-align: top;
}
table.pretty td {
    padding: 2px 4px;
    border-left: 0;
}
table.comments td {
    padding: 4px;
    line-height: 17px;
}
table.repositories {
    border-spacing: 0px;
}
table.repositories th {
    padding: 4px;
    border:0;
}
table.repositories td {
    padding: 2px;
    border-left: 0;
}
table.repositories td.rightAlign {
    text-align: right;
}
table.repositories td.icon img {
    vertical-align: top;
}
table.repositories tr.group {
    background-color: #ccc;
}
table.repositories tr.group td {
    font-weight: bold;
    color: black;
    background-color: #ddd;
    padding-left: 5px;
    border-top: 1px solid #aaa;
     border-bottom: 1px solid #aaa;
}
table.palette { border:0; width: 0 !important; }
table.palette td.header {
    font-weight: bold;
    background-color: #ffffff !important;
    padding-top: 0px !important;
    margin-bottom: 0 !imporant;
    border: 0 !important;
    border-radius: 0 !important;
    line-height: 1em;
}
table.palette td.pane {
    padding: 0px;
}
table.gitnotes {
    border: 0;
}
table.gitnotes td {
    border-top: 1px solid #ccc;
    padding-top: 3px;
    vertical-align:top;
}
table.gitnotes table {
    border: none;
}
table.gitnotes td table td {
    border: none;
    padding: 0px;
}
table.gitnotes td.info {
}
table.gitnotes td.message {
    width: 65%;
    border-left: 1px solid #ccc;
}
table.annotated {
}
table.annotated tr.even {
    background-color: white;
}
table.annotated tr.odd {
    background-color: #f5f5f5;
}
table.annotated td {
    padding: 0px;
    border: 0;
}
tr th a { background-position: right; padding-right: 15px; background-repeat:no-repeat; }
tr th.wicket_orderDown a {background-image: url(arrow_down.png); }
tr th.wicket_orderUp a { background-image: url(arrow_up.png); }
tr th.wicket_orderNone a { background-image: url(arrow_off.png); }
tr.light {
    background-color: #ffffff;
}
tr.dark {
    background-color: #f5f5f5;
}
/* currently both use the same, but it can change */
tr.light:hover,
tr.dark:hover {
    background-color: #000070;
    color: white;
}
tr.light:hover a,
tr.dark:hover a {
    color: white;
}
td.author {
    font-style: italic !important;
}
td.date {
    font-style: italic !important;
}
span.sha1, span.sha1 a, span.sha1 a span {
    font-family: monospace;
    font-size: 13px;
}
td.mode {
    text-align: right;
    font-family: monospace;
    width: 8em;
    padding-right:15px;
}
td.size {
    text-align: right;
    width: 8em;
    padding-right:15px;
}
td.rightAlign {
    text-align: right;
}
td.treeLinks {
    text-align: right;
    width: 13em;
}
span.metricsTitle {
    font-size: 2em;
}
span .tagRef, span .headRef, span .localBranch, span .remoteBranch, span .otherRef {
    padding: 0px 3px;
    margin-right:2px;
    font-family: sans-serif;
    font-size: 9px;
    font-weight: normal;
    border: 1px solid;
    color: black;
}
span .tagRef a span, span .headRef a span, span .localBranch a span, span .remoteBranch a span, span .otherRef a span {
    font-size: 9px;
}
span .tagRef a, span .headRef a, span .localBranch a, span .remoteBranch a, span .otherRef a {
    text-decoration: none;
    color: black !important;
}
span .tagRef a:hover, span .headRef a:hover, span .localBranch a:hover, span .remoteBranch a:hover, span .otherRef a:hover {
    color: black !important;
    text-decoration: underline;
}
span .otherRef {
    background-color: #b0e0f0;
    border-color: #80aaaa;
}
span .remoteBranch {
    background-color: #cAc2f5;
    border-color: #6c6cbf;
}
span .tagRef {
    background-color: #ffffaa;
    border-color: #ffcc00;
}
span .headRef {
    background-color: #ffaaff;
    border-color: #ff00ee;
}
span .localBranch {
    background-color: #ccffcc;
    border-color: #00cc33;
}
table .palette td.buttons button {
    -webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;
    border: 1px solid #ccc !important;
    padding: 10px;
    margin-bottom: 10px;
}
table .palette td.buttons button:hover {
    border: 1px solid #0069D6 !important;
}
table .palette td.buttons button:active {
    border: 1px solid orange !important;
}
.feedbackPanelERROR, .feedbackPanelINFO {
    list-style: none;
    line-height: 35px;
}
.feedbackPanelINFO span, .feedbackPanelERROR span {
    position:relative;padding:7px 15px;margin-top:5px;margin-bottom:5px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);
}
.feedbackPanelERROR span {
    color: #ffffff;
    background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
}
/* google-code-prettify line numbers */
li.L0,
li.L1,
li.L2,
li.L3,
li.L4,
li.L5,
li.L6,
li.L7,
li.L8,
li.L9 { color: #888; border-left: 1px solid #ccc; padding-left:5px; list-style-type: decimal !important; }
/* Alternate shading for lines */
li.L1,
li.L3,
li.L5,
li.L7,
li.L9 { background: #fafafa !important; }
resources/gitblt2_white.png
resources/gitblt_25_white.png
resources/login.mkd
New file
@@ -0,0 +1,3 @@
## Please Login
Pleaes enter your credentials to access this Gitblit site.
resources/markdown.css
@@ -4,6 +4,11 @@
div.markdown {
    line-height: 1.4em;
    color: black;
}
div.markdown li {
    color: black;
}
div.markdown h1,
@@ -16,16 +21,14 @@
}
div.markdown h1 {    
    margin-top: 1em;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
    padding-bottom: 0.5em;
    border-bottom: 2px solid #000080 !important;
}
div.markdown h2 {
    margin-top: 1em;
    margin-bottom: 0.5em;    
    padding-bottom: 0.5em;
    border-bottom: 2px solid #000080 !important;    
}
src/com/gitblit/build/BuildSite.java
@@ -91,7 +91,7 @@
        System.out.println(MessageFormat.format("Generating site from {0} Markdown Docs in {1} ",
                markdownFiles.length, sourceFolder.getAbsolutePath()));
        String linkPattern = "<a href=''{0}''>{1}</a>";
        String linkPattern = "<li><a href=''{0}''>{1}</a></li>";
        StringBuilder sb = new StringBuilder();
        for (File file : markdownFiles) {
            String documentName = getDocumentName(file);
src/com/gitblit/models/FederationModel.java
@@ -198,22 +198,7 @@
        @Override
        public int compareTo(RepositoryStatus o) {
            if (status.equals(o.status)) {
                // sort root repositories first, alphabetically
                // then sort grouped repositories, alphabetically
                int s1 = name.indexOf('/');
                int s2 = o.name.indexOf('/');
                if (s1 == -1 && s2 == -1) {
                    // neither grouped
                    return name.compareTo(o.name);
                } else if (s1 > -1 && s2 > -1) {
                    // both grouped
                    return name.compareTo(o.name);
                } else if (s1 == -1) {
                    return -1;
                } else if (s2 == -1) {
                    return 1;
                }
                return 0;
                return StringUtils.compareRepositoryNames(name, o.name);
            }
            return status.compareTo(o.status);
        }
src/com/gitblit/models/RepositoryModel.java
@@ -22,6 +22,7 @@
import com.gitblit.Constants.AccessRestrictionType;
import com.gitblit.Constants.FederationStrategy;
import com.gitblit.utils.StringUtils;
/**
 * RepositoryModel is a serializable model class that represents a Gitblit
@@ -74,6 +75,6 @@
    @Override
    public int compareTo(RepositoryModel o) {
        return name.compareTo(o.name);
        return StringUtils.compareRepositoryNames(name, o.name);
    }
}
src/com/gitblit/utils/JGitUtils.java
@@ -299,7 +299,7 @@
        }
        list.addAll(getRepositoryList(repositoriesFolder.getAbsolutePath(), repositoriesFolder,
                exportAll, searchSubfolders));
        Collections.sort(list);
        StringUtils.sortRepositorynames(list);
        return list;
    }
src/com/gitblit/utils/StringUtils.java
@@ -19,6 +19,8 @@
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.PatternSyntaxException;
@@ -395,4 +397,44 @@
        }
        return false;
    }
    /**
     * Compare two repository names for proper group sorting.
     *
     * @param r1
     * @param r2
     * @return
     */
    public static int compareRepositoryNames(String r1, String r2) {
        // sort root repositories first, alphabetically
        // then sort grouped repositories, alphabetically
        int s1 = r1.indexOf('/');
        int s2 = r2.indexOf('/');
        if (s1 == -1 && s2 == -1) {
            // neither grouped
            return r1.compareTo(r2);
        } else if (s1 > -1 && s2 > -1) {
            // both grouped
            return r1.compareTo(r2);
        } else if (s1 == -1) {
            return -1;
        } else if (s2 == -1) {
            return 1;
        }
        return 0;
    }
    /**
     * Sort grouped repository names.
     *
     * @param list
     */
    public static void sortRepositorynames(List<String> list) {
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return compareRepositoryNames(o1, o2);
            }
        });
    }
}
src/com/gitblit/wicket/AuthorizationStrategy.java
@@ -24,7 +24,6 @@
import com.gitblit.Keys;
import com.gitblit.models.UserModel;
import com.gitblit.wicket.pages.BasePage;
import com.gitblit.wicket.pages.LoginPage;
import com.gitblit.wicket.pages.RepositoriesPage;
public class AuthorizationStrategy extends AbstractPageAuthorizationStrategy implements
@@ -36,6 +35,12 @@
    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Override
    protected boolean isPageAuthorized(Class pageClass) {
        if (RepositoriesPage.class.equals(pageClass)) {
            // allow all requests to get to the RepositoriesPage with its inline
            // authentication form
            return true;
        }
        if (BasePage.class.isAssignableFrom(pageClass)) {
            boolean authenticateView = GitBlit.getBoolean(Keys.web.authenticateViewPages, true);
            boolean authenticateAdmin = GitBlit.getBoolean(Keys.web.authenticateAdminPages, true);
@@ -73,12 +78,7 @@
    @Override
    public void onUnauthorizedInstantiation(Component component) {
        if (component instanceof BasePage) {
            GitBlitWebSession session = GitBlitWebSession.get();
            if (!session.isLoggedIn()) {
                throw new RestartResponseAtInterceptPageException(LoginPage.class);
            } else {
                throw new RestartResponseAtInterceptPageException(RepositoriesPage.class);
            }
        }
    }
}
src/com/gitblit/wicket/GitBlitWebApp.java
@@ -32,17 +32,15 @@
import com.gitblit.wicket.pages.CommitDiffPage;
import com.gitblit.wicket.pages.CommitPage;
import com.gitblit.wicket.pages.DocsPage;
import com.gitblit.wicket.pages.ReviewProposalPage;
import com.gitblit.wicket.pages.FederationRegistrationPage;
import com.gitblit.wicket.pages.HistoryPage;
import com.gitblit.wicket.pages.LogPage;
import com.gitblit.wicket.pages.LoginPage;
import com.gitblit.wicket.pages.LogoutPage;
import com.gitblit.wicket.pages.MarkdownPage;
import com.gitblit.wicket.pages.MetricsPage;
import com.gitblit.wicket.pages.PatchPage;
import com.gitblit.wicket.pages.RawPage;
import com.gitblit.wicket.pages.RepositoriesPage;
import com.gitblit.wicket.pages.ReviewProposalPage;
import com.gitblit.wicket.pages.SearchPage;
import com.gitblit.wicket.pages.SummaryPage;
import com.gitblit.wicket.pages.TagPage;
@@ -100,12 +98,6 @@
        // federation urls
        mount("/proposal", ReviewProposalPage.class, "t");
        mount("/registration", FederationRegistrationPage.class, "u", "n");
        // setup login/logout urls, if we are using authentication
        if (useAuthentication) {
            mount("/login", LoginPage.class);
            mount("/logout", LogoutPage.class);
        }
    }
    private void mount(String location, Class<? extends WebPage> clazz, String... parameters) {
src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -66,7 +66,7 @@
gb.missingUsername = Missing Username
gb.edit = edit
gb.searchTypeTooltip = Select Search Type
gb.searchTooltip = Search Gitblit
gb.searchTooltip = Search {0}
gb.delete = delete
gb.docs = docs
gb.accessRestriction = access restriction
@@ -139,3 +139,5 @@
gb.myUrlDescription = the publicly accessible url for your Gitblit instance
gb.destinationUrl = send to
gb.destinationUrlDescription = the url of the Gitblit instance to send your proposal
gb.users = users
gb.federation = federation
src/com/gitblit/wicket/WicketUtils.java
@@ -88,13 +88,13 @@
    public static void setTicketCssClass(Component container, String state) {
        String css = null;
        if (state.equals("open")) {
            css = "bug_open";
            css = "label important";
        } else if (state.equals("hold")) {
            css = "bug_hold";
            css = "label warning";
        } else if (state.equals("resolved")) {
            css = "bug_resolved";
            css = "label success";
        } else if (state.equals("invalid")) {
            css = "bug_invalid";
            css = "label";
        }
        if (css != null) {
            setCssClass(container, css);
@@ -102,7 +102,7 @@
    }
    public static void setAlternatingBackground(Component c, int i) {
        String clazz = i % 2 == 0 ? "dark" : "light";
        String clazz = i % 2 == 0 ? "light" : "dark";
        setCssClass(c, clazz);
    }
src/com/gitblit/wicket/pages/BasePage.html
@@ -7,20 +7,14 @@
    <!-- Head -->
    <wicket:head>
           <title wicket:id="title">[page title]</title>
        <link rel="stylesheet" type="text/css" href="gitblit.css"/>
        <link rel="stylesheet" href="bootstrap.130.css"/>
        <link rel="stylesheet" type="text/css" href="bootstrap.gb.css"/>
        <link rel="icon" href="gitblt-favicon.png" type="image/png" />
    </wicket:head>
    <body>
        <!-- page header -->
        <div class="page_header">
            <a title="gitblit homepage" href="http://gitblit.com/">
                <img src="gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
            </a>
            <span>
                <span wicket:id="siteName">[site name]</span> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>
            </span>
        </div>
    <body style="padding-top: 40px;">
        <div class="container">
        <div class="content">
        <!-- page content -->
        <wicket:child />
@@ -28,10 +22,14 @@
        <!-- page footer -->
        <div class="page_footer">
            <div style="float:right">
                <a title="gitblit homepage" href="http://gitblit.com/">
                <span wicket:id="gbVersion"></span> 
                </a>
            </div>
            <div wicket:id="userPanel">[user panel]</div>
        </div>
        </div>
        </div>
    </body>
    
    <!-- user fragment -->
src/com/gitblit/wicket/pages/BasePage.java
@@ -29,6 +29,7 @@
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.protocol.http.WebRequest;
@@ -87,21 +88,15 @@
    }
    protected void setupPage(String repositoryName, String pageName) {
        if (repositoryName != null && repositoryName.trim().length() > 0) {
            add(new Label("title", getServerName() + " - " + repositoryName));
        } else {
            add(new Label("title", getServerName()));
        }
        // header
        String siteName = GitBlit.getString(Keys.web.siteName, Constants.NAME);
        if (siteName == null || siteName.trim().length() == 0) {
            siteName = Constants.NAME;
        }
        add(new LinkPanel("siteName", null, siteName, RepositoriesPage.class, null));
        add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class,
                WicketUtils.newRepositoryParameter(repositoryName)));
        add(new Label("pageName", pageName));
        ExternalLink rootLink = new ExternalLink("rootLink", urlFor(RepositoriesPage.class, null).toString());
        WicketUtils.setHtmlTooltip(rootLink, GitBlit.getString(Keys.web.siteName, Constants.NAME));
        add(rootLink);
        // Feedback panel for info, warning, and non-fatal error messages
        add(new FeedbackPanel("feedback"));
@@ -200,7 +195,7 @@
        if (GitBlitWebSession.get().isLoggedIn()) {
            error(message, true);
        } else {
            throw new RestartResponseAtInterceptPageException(LoginPage.class);
            throw new RestartResponseAtInterceptPageException(RepositoriesPage.class);
        }
    }
@@ -226,8 +221,7 @@
            } else {
                // login
                add(new Label("username").setVisible(false));
                add(new LinkPanel("loginLink", null, markupProvider.getString("gb.login"),
                        LoginPage.class));
                add(new Label("loginLink").setVisible(false));
                add(new Label("separator").setVisible(false));
                add(new Label("changePasswordLink").setVisible(false));
            }
src/com/gitblit/wicket/pages/BlamePage.html
@@ -19,12 +19,12 @@
    <div wicket:id="breadcrumbs">[breadcrumbs]</div>
        
    <!--  blame content -->
    <table class="annotated" style="border-top: 0px; margin-bottom:5px;">
    <table class="annotated" style="margin-bottom:5px;">
        <tbody>
            <tr>
                <th>Commit</th>
                <th>Line</th>
                <th>Data</th>
                <th>Content</th>
            </tr>
            <tr wicket:id="annotation">
                <td><span class="sha1" wicket:id="commit"></span></td>
src/com/gitblit/wicket/pages/ChangePasswordPage.html
@@ -4,20 +4,9 @@
      xml:lang="en"  
      lang="en"> 
      
    <!-- Head with Wicket-controlled resources in this package -->
    <wicket:head>
           <title wicket:id="title">[page title]</title>
        <link rel="stylesheet" type="text/css" href="gitblit.css"/>
        <link rel="shortcut icon" href="gitblt-favicon.png" type="image/png" />
    </wicket:head>
    <wicket:extend>
    <body onload="document.getElementById('password').focus();">
        <div>
            <div style="padding-top: 10px;text-align:center;">
                <img src="gitblt_25.png" alt="Gitblit"/><br/>
                <div style="padding-top:30px;font-weight:bold;" wicket:id="name"></div>
            </div>
            <p/>
            <form style="text-align:center;" wicket:id="passwordForm">
                <center>
                    <table class="plain">
@@ -30,11 +19,11 @@
                        <td class="edit"><input type="password" wicket:id="confirmPassword" size="30" tabindex="2" /></td>
                    </tr>
                    </table>
                    <input type="submit" wicket:message="value:gb.save" wicket:id="save" tabindex="3" />
                    <input type="submit" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="4" />
                    <div style="padding-top:10px;" wicket:id="feedback"></div>
                    <input class="btn" type="submit" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="3" />
                    <input class="btn primary" type="submit" wicket:message="value:gb.save" wicket:id="save" tabindex="4" />
                </center>
            </form>            
        </div>
    </body>
    </wicket:extend>
</html>
src/com/gitblit/wicket/pages/ChangePasswordPage.java
@@ -18,17 +18,13 @@
import java.text.MessageFormat;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.WebResponse;
import com.gitblit.Constants;
import com.gitblit.GitBlit;
import com.gitblit.GitBlitException;
import com.gitblit.Keys;
@@ -36,7 +32,7 @@
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
public class ChangePasswordPage extends WebPage {
public class ChangePasswordPage extends RootSubPage {
    IModel<String> password = new Model<String>("");
    IModel<String> confirmPassword = new Model<String>("");
@@ -54,10 +50,7 @@
            // no authentication enabled
            throw new RestartResponseException(getApplication().getHomePage());
        }
        add(new Label("title", GitBlit.getString(Keys.web.siteName, Constants.NAME)));
        add(new Label("name", getString("gb.changePassword") + ": "
                + GitBlitWebSession.get().getUser().username));
        setupPage(getString("gb.changePassword"), GitBlitWebSession.get().getUser().username);
        StatelessForm<Void> form = new StatelessForm<Void>("passwordForm") {
@@ -115,7 +108,6 @@
                confirmPassword);
        confirmPasswordField.setResetPassword(false);
        form.add(confirmPasswordField);
        form.add(new FeedbackPanel("feedback"));
        form.add(new Button("save"));
        Button cancel = new Button("cancel") {
src/com/gitblit/wicket/pages/EditRepositoryPage.html
@@ -6,35 +6,29 @@
<wicket:extend>
<body onload="document.getElementById('name').focus();">
    <!-- Push content down to preserve header image -->
    <div style="padding-top:20px"></div>
    <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
    <!-- Repository Table -->
    <form wicket:id="editForm">
        <table class="plain">
            <tbody>
                <tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input type="text" wicket:id="name" id="name" size="40" tabindex="1" /> &nbsp;<i><wicket:message key="gb.nameDescription"></wicket:message></i></td></tr>
                <tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input type="text" wicket:id="description" size="40" tabindex="2" /></td></tr>
                <tr><th><wicket:message key="gb.origin"></wicket:message></th><td class="edit"><input type="text" wicket:id="origin" size="80" tabindex="3" /></td></tr>
                <tr><th><wicket:message key="gb.name"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="name" id="name" size="40" tabindex="1" /> &nbsp;<i><wicket:message key="gb.nameDescription"></wicket:message></i></td></tr>
                <tr><th><wicket:message key="gb.description"></wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="description" size="40" tabindex="2" /></td></tr>
                <tr><th><wicket:message key="gb.origin"></wicket:message></th><td class="edit"><input class="span7" type="text" wicket:id="origin" size="80" tabindex="3" /></td></tr>
                <tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select wicket:id="owner" tabindex="4" /> &nbsp;<i><wicket:message key="gb.ownerDescription"></wicket:message></i></td></tr>
                <tr><th><wicket:message key="gb.enableTickets"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useTickets" tabindex="5" /> &nbsp;<i><wicket:message key="gb.useTicketsDescription"></wicket:message></i></td></tr>
                <tr><th><wicket:message key="gb.enableDocs"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="useDocs" tabindex="6" /> &nbsp;<i><wicket:message key="gb.useDocsDescription"></wicket:message></i></td></tr>
                <tr><th><wicket:message key="gb.showRemoteBranches"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showRemoteBranches" tabindex="7" /> &nbsp;<i><wicket:message key="gb.showRemoteBranchesDescription"></wicket:message></i></td></tr>
                <tr><th><wicket:message key="gb.showReadme"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="showReadme" tabindex="8" /> &nbsp;<i><wicket:message key="gb.showReadmeDescription"></wicket:message></i></td></tr>
                <tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="isFrozen" tabindex="9" /> &nbsp;<i><wicket:message key="gb.isFrozenDescription"></wicket:message></i></td></tr>
                <tr><td style="padding-top:10px;" colspan="2"><hr></hr></td></tr>
                <tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select wicket:id="accessRestriction" tabindex="10" /></td></tr>
                <tr><td colspan="2"><hr></hr></td></tr>
                <tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select class="span6" wicket:id="accessRestriction" tabindex="10" /></td></tr>
                <tr><th style="vertical-align: top;"><wicket:message key="gb.permittedUsers"></wicket:message></th><td style="padding:2px;"><span wicket:id="users"></span></td></tr>
                <tr><td style="padding-top:10px;" colspan="2"><hr></hr></td></tr>
                <tr><th><wicket:message key="gb.federationStrategy"></wicket:message></th><td class="edit"><select wicket:id="federationStrategy" tabindex="11" /></td></tr>
                <tr><td colspan="2"><hr></hr></td></tr>
                <tr><th><wicket:message key="gb.federationStrategy"></wicket:message></th><td class="edit"><select class="span6" wicket:id="federationStrategy" tabindex="11" /></td></tr>
                <tr><th style="vertical-align: top;"><wicket:message key="gb.federationSets"></wicket:message></th><td style="padding:2px;"><span wicket:id="federationSets"></span></td></tr>                
                <tr><th></th><td class="editButton"><input type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="12" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="13" /></td></tr>
                <tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="12" /> &nbsp; <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="13" /> </td></tr>
            </tbody>
        </table>
    </form>    
</body>
</wicket:extend>
</html>
src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -47,7 +47,7 @@
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
public class EditRepositoryPage extends BasePage {
public class EditRepositoryPage extends RootSubPage {
    private final boolean isCreate;
@@ -76,9 +76,9 @@
        List<String> federationSets = new ArrayList<String>();
        List<String> repositoryUsers = new ArrayList<String>();
        if (isCreate) {
            super.setupPage("", getString("gb.newRepository"));
            super.setupPage(getString("gb.newRepository"), "");
        } else {
            super.setupPage("", getString("gb.edit"));
            super.setupPage(getString("gb.edit"), repositoryModel.name);
            if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
                repositoryUsers.addAll(GitBlit.self().getRepositoryUsers(repositoryModel));
                Collections.sort(repositoryUsers);
@@ -86,6 +86,7 @@
            federationSets.addAll(repositoryModel.federationSets);
        }
        final String oldName = repositoryModel.name;
        // users palette
        final Palette<String> usersPalette = new Palette<String>("users", new ListModel<String>(
src/com/gitblit/wicket/pages/EditUserPage.html
@@ -6,12 +6,7 @@
<wicket:extend>
<body onload="document.getElementById('username').focus();">
    <!-- Push content down to preserve header image -->
    <div style="padding-top:20px"></div>
    <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
    <!-- Repository Table -->
    <!-- User Table -->
    <form wicket:id="editForm">
        <table class="plain">
            <tbody>
@@ -21,7 +16,7 @@
                <tr><th><wicket:message key="gb.canAdmin"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="canAdmin" tabindex="6" /> &nbsp;<i><wicket:message key="gb.canAdminDescription"></wicket:message></i></td></tr>                
                <tr><th><wicket:message key="gb.excludeFromFederation"></wicket:message></th><td class="edit"><input type="checkbox" wicket:id="excludeFromFederation" tabindex="7" /> &nbsp;<i><wicket:message key="gb.excludeFromFederationDescription"></wicket:message></i></td></tr>                
                <tr><th style="vertical-align: top;"><wicket:message key="gb.restrictedRepositories"></wicket:message></th><td style="padding:2px;"><span wicket:id="repositories"></span></td></tr>
                <tr><th></th><td class="editButton"><input type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="8" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="9" /></td></tr>
                <tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" tabindex="8" /> &nbsp; <input class="btn primary" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" tabindex="9" /></td></tr>
            </tbody>
        </table>
    </form>    
src/com/gitblit/wicket/pages/EditUserPage.java
@@ -44,7 +44,7 @@
import com.gitblit.wicket.WicketUtils;
@RequiresAdminRole
public class EditUserPage extends BasePage {
public class EditUserPage extends RootSubPage {
    private final boolean isCreate;
@@ -66,10 +66,11 @@
    protected void setupPage(final UserModel userModel) {
        if (isCreate) {
            super.setupPage("", getString("gb.newUser"));
            super.setupPage(getString("gb.newUser"), "");
        } else {
            super.setupPage("", getString("gb.edit"));
            super.setupPage(getString("gb.edit"), userModel.username);
        }
        final Model<String> confirmPassword = new Model<String>(
                StringUtils.isEmpty(userModel.password) ? "" : userModel.password);
        CompoundPropertyModel<UserModel> model = new CompoundPropertyModel<UserModel>(userModel);
@@ -156,8 +157,8 @@
                            userModel.username));
                    setResponsePage(EditUserPage.class);
                } else {
                    // back to home
                    setResponsePage(RepositoriesPage.class);
                    // back to users page
                    setResponsePage(UsersPage.class);
                }
            }
        };
@@ -181,7 +182,7 @@
            @Override
            public void onSubmit() {
                setResponsePage(RepositoriesPage.class);
                setResponsePage(UsersPage.class);
            }
        };
        cancel.setDefaultFormProcessing(false);
src/com/gitblit/wicket/pages/FederationPage.html
New file
@@ -0,0 +1,17 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
      xml:lang="en"
      lang="en">
<body>
<wicket:extend>
    <div wicket:id="federationTokensPanel">[federation tokens panel]</div>
    <div style="padding-top: 10px;" wicket:id="federationProposalsPanel">[federation proposals panel]</div>
    <div style="padding-top: 10px;" wicket:id="federationRegistrationsPanel">[federation registrations panel]</div>
</wicket:extend>
</body>
</html>
src/com/gitblit/wicket/pages/FederationPage.java
New file
@@ -0,0 +1,52 @@
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.wicket.pages;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.wicket.panels.FederationProposalsPanel;
import com.gitblit.wicket.panels.FederationRegistrationsPanel;
import com.gitblit.wicket.panels.FederationTokensPanel;
public class FederationPage extends RootPage {
    public FederationPage() {
        super();
        setupPage("", "");
        boolean showFederation = showAdmin && GitBlit.canFederate();
        add(new FederationTokensPanel("federationTokensPanel", showFederation)
                .setVisible(showFederation));
        FederationProposalsPanel proposalsPanel = new FederationProposalsPanel(
                "federationProposalsPanel");
        if (showFederation) {
            proposalsPanel.hideIfEmpty();
        } else {
            proposalsPanel.setVisible(false);
        }
        boolean showRegistrations = GitBlit.getBoolean(Keys.web.showFederationRegistrations, false);
        FederationRegistrationsPanel registrationsPanel = new FederationRegistrationsPanel(
                "federationRegistrationsPanel");
        if (showAdmin || showRegistrations) {
            registrationsPanel.hideIfEmpty();
        } else {
            registrationsPanel.setVisible(false);
        }
        add(proposalsPanel);
        add(registrationsPanel);
    }
}
src/com/gitblit/wicket/pages/FederationRegistrationPage.html
@@ -6,11 +6,6 @@
<body>
<wicket:extend>
    <div style="padding-top:20px"></div>
    <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
    <!-- registration info -->
    <table class="plain">
        <tr><th><wicket:message key="gb.url">url</wicket:message></th><td><img style="border:0px;vertical-align:middle;" wicket:id="typeIcon" /> <span wicket:id="url">[url]</span></td></tr>
src/com/gitblit/wicket/pages/FederationRegistrationPage.java
@@ -25,24 +25,15 @@
import org.apache.wicket.markup.repeater.data.ListDataProvider;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.models.FederationModel;
import com.gitblit.models.FederationModel.RepositoryStatus;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
public class FederationRegistrationPage extends BasePage {
public class FederationRegistrationPage extends RootSubPage {
    public FederationRegistrationPage(PageParameters params) {
        super(params);
        final boolean showAdmin;
        if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
            boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
            showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
        } else {
            showAdmin = false;
        }
        setStatelessHint(true);
        String url = WicketUtils.getUrlParameter(params);
@@ -53,8 +44,8 @@
            error("Could not find federation registration!", true);
        }
        setupPage("", registration.isResultData() ? getString("gb.federationResults")
                : getString("gb.federationRegistration"));
        setupPage(registration.isResultData() ? getString("gb.federationResults")
                : getString("gb.federationRegistration"), registration.url);
        add(new Label("url", registration.url));
        add(WicketUtils.getRegistrationImage("typeIcon", registration, this));
src/com/gitblit/wicket/pages/LoginPage.html
File was deleted
src/com/gitblit/wicket/pages/LoginPage.java
File was deleted
src/com/gitblit/wicket/pages/MetricsPage.java
@@ -68,7 +68,7 @@
        if ((metrics != null) && (metrics.size() > 0)) {
            IChartData data = WicketUtils.getChartData(metrics);
            ChartProvider provider = new ChartProvider(new Dimension(500, 100), ChartType.LINE,
            ChartProvider provider = new ChartProvider(new Dimension(400, 100), ChartType.LINE,
                    data);
            ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
            dateAxis.setLabels(new String[] { metrics.get(0).name,
@@ -93,7 +93,7 @@
        if ((metrics != null) && (metrics.size() > 0)) {
            IChartData data = WicketUtils.getChartData(metrics);
            ChartProvider provider = new ChartProvider(new Dimension(500, 100),
            ChartProvider provider = new ChartProvider(new Dimension(400, 100),
                    ChartType.BAR_VERTICAL_SET, data);
            ChartAxis dateAxis = new ChartAxis(ChartAxisType.BOTTOM);
            List<String> labels = new ArrayList<String>();
src/com/gitblit/wicket/pages/RepositoriesPage.html
@@ -9,23 +9,9 @@
<body>
<wicket:extend>
    <!-- Filler div -->
    <div style="padding-top:18px;"></div>
    <div style="text-align:center;padding-bottom:5px;" wicket:id="feedback">[Feedback Panel]</div>
    <div class="markdown" style="margin-top:-0.5em;padding-bottom:5px;" wicket:id="repositoriesMessage">[repositories message]</div>
    <div class="markdown" style="margin-top:-1em;padding-bottom:5px;" wicket:id="repositoriesMessage">[repositories message]</div>
    
    <div wicket:id="repositoriesPanel">[repositories panel]</div>
    <div style="padding-top: 10px;"wicket:id="usersPanel">[users panel]</div>
    <div style="padding-top: 10px;"wicket:id="federationTokensPanel">[federation tokens panel]</div>
    <div style="padding-top: 10px;"wicket:id="federationProposalsPanel">[federation proposals panel]</div>
    <div style="padding-top: 10px;"wicket:id="federationRegistrationsPanel">[federation registrations panel]</div>
</wicket:extend>
</body>
</html>
src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -31,66 +31,48 @@
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.FederationProposalsPanel;
import com.gitblit.wicket.panels.FederationRegistrationsPanel;
import com.gitblit.wicket.panels.FederationTokensPanel;
import com.gitblit.wicket.panels.RepositoriesPanel;
import com.gitblit.wicket.panels.UsersPanel;
public class RepositoriesPage extends BasePage {
public class RepositoriesPage extends RootPage {
    public RepositoriesPage() {
        super();
        setupPage("", "");
        final boolean showAdmin;
        if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
            boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
            showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
            // authentication requires state and session
            setStatelessHint(false);
        } else {
            showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
            if (GitBlit.getBoolean(Keys.web.authenticateViewPages, false)) {
                // authentication requires state and session
                setStatelessHint(false);
            } else {
                // no authentication required, no state and no session required
                setStatelessHint(true);
            }
        }
        // display an error message cached from a redirect
        String cachedMessage = GitBlitWebSession.get().clearErrorMessage();
        if (!StringUtils.isEmpty(cachedMessage)) {
            error(cachedMessage);
        } else if (showAdmin) {
            int pendingProposals = GitBlit.self().getPendingFederationProposals().size();
            if (pendingProposals == 1) {
                info("There is 1 federation proposal awaiting review.");
            } else if (pendingProposals > 1) {
                info(MessageFormat.format("There are {0} federation proposals awaiting review.",
                        pendingProposals));
            }
        // check to see if we should display a login message
        boolean authenticateView = GitBlit.getBoolean(Keys.web.authenticateViewPages, true);
        if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) {
            String messageSource = GitBlit.getString(Keys.web.loginMessage, "gitblit");
            String message = readMarkdown(messageSource, "login.mkd");
            Component repositoriesMessage = new Label("repositoriesMessage", message);
            add(repositoriesMessage.setEscapeModelStrings(false));
            add(new Label("repositoriesPanel"));
            return;
        }
        // Load the markdown welcome message
        String messageSource = GitBlit.getString(Keys.web.repositoriesMessage, "gitblit");
        String message = "<br/>";
        if (messageSource.equalsIgnoreCase("gitblit")) {
            // Read default welcome message
            try {
                ContextRelativeResource res = WicketUtils.getResource("welcome.mkd");
                InputStream is = res.getResourceStream().getInputStream();
                InputStreamReader reader = new InputStreamReader(is);
                message = MarkdownUtils.transformMarkdown(reader);
                reader.close();
            } catch (Throwable t) {
                message = "Failed to read default welcome message!";
                error(message, t, false);
        String message = readMarkdown(messageSource, "welcome.mkd");
        Component repositoriesMessage = new Label("repositoriesMessage", message)
                .setEscapeModelStrings(false).setVisible(message.length() > 0);
        add(repositoriesMessage);
        RepositoriesPanel repositories = new RepositoriesPanel("repositoriesPanel", showAdmin,
                null, getAccessRestrictions());
        // push the panel down if we are hiding the admin controls and the
        // welcome message
        if (!showAdmin && !repositoriesMessage.isVisible()) {
            WicketUtils.setCssStyle(repositories, "padding-top:5px;");
            }
        add(repositories);
    }
    private String readMarkdown(String messageSource, String resource) {
        String message = "";
        if (messageSource.equalsIgnoreCase("gitblit")) {
            // Read default message
            message = readDefaultMarkdown(resource);
        } else {
            // Read user-supplied welcome message
            // Read user-supplied message
            if (!StringUtils.isEmpty(messageSource)) {
                File file = new File(messageSource);
                if (file.exists()) {
@@ -106,31 +88,21 @@
                }
            }
        }
        Component repositoriesMessage = new Label("repositoriesMessage", message)
                .setEscapeModelStrings(false);
        add(repositoriesMessage);
        add(new RepositoriesPanel("repositoriesPanel", showAdmin, null, getAccessRestrictions()));
        add(new UsersPanel("usersPanel", showAdmin).setVisible(showAdmin));
        boolean showFederation = showAdmin && GitBlit.canFederate();
        add(new FederationTokensPanel("federationTokensPanel", showFederation)
                .setVisible(showFederation));
        FederationProposalsPanel proposalsPanel = new FederationProposalsPanel(
                "federationProposalsPanel");
        if (showFederation) {
            proposalsPanel.hideIfEmpty();
        } else {
            proposalsPanel.setVisible(false);
        return message;
        }
        boolean showRegistrations = GitBlit.getBoolean(Keys.web.showFederationRegistrations, false);
        FederationRegistrationsPanel registrationsPanel = new FederationRegistrationsPanel(
                "federationRegistrationsPanel");
        if (showAdmin || showRegistrations) {
            registrationsPanel.hideIfEmpty();
        } else {
            registrationsPanel.setVisible(false);
    private String readDefaultMarkdown(String file) {
        String message;
        try {
            ContextRelativeResource res = WicketUtils.getResource(file);
            InputStream is = res.getResourceStream().getInputStream();
            InputStreamReader reader = new InputStreamReader(is);
            message = MarkdownUtils.transformMarkdown(reader);
            reader.close();
        } catch (Throwable t) {
            message = MessageFormat.format("Failed to read default message from {0}!", file);
            error(message, t, false);
        }
        add(proposalsPanel);
        add(registrationsPanel);
        return message;
    }
}
src/com/gitblit/wicket/pages/RepositoryPage.html
@@ -8,24 +8,42 @@
    <wicket:extend>
        <!-- page header bar -->    
        <div>
            <!-- floating search form on right -->
            <!-- page nav links -->
            <div class="topbar">
            <div class="fill">
            <div class="container">
                <a class="brand" wicket:id="rootLink">
                    <img src="gitblt_25_white.png" width="79" height="25" alt="gitblit" class="logo"/>
                </a>
                <ul class="nav">
                    <li><a wicket:id="repositories"><wicket:message key="gb.repositories"></wicket:message></a></li>
                    <li><a wicket:id="summary"><wicket:message key="gb.summary"></wicket:message></a></li>
                    <li><a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a></li>
                    <li><a wicket:id="branches"><wicket:message key="gb.branches"></wicket:message></a></li>
                    <li><a wicket:id="tags"><wicket:message key="gb.tags"></wicket:message></a></li>
                    <li><a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a></li>
                    <li wicket:id="extra"><span wicket:id="extraLink"></span></li>
                    <li><a style="text-decoration: none;" wicket:id="syndication">
                        <img style="border:0px;vertical-align:middle;" src="feed_16x16.png"></img></a>
                    </li>
                </ul>
                <form class="pull-right" wicket:id="searchForm">
            <div class="search">
                <form wicket:id="searchForm">
                    <select wicket:id="searchType"/>
                    <input type="text" id="searchBox" wicket:id="searchBox" size="25" value=""/>
                        <select class="small" wicket:id="searchType"/>
                        <input type="text" id="searchBox" wicket:id="searchBox" value=""/>
                    </div>
                </form>
            </div>
            <!-- page nav links -->
            <div class="page_nav">
                <a style="text-decoration: none;" wicket:id="syndication">
                    <img style="border:0px;vertical-align:middle;" src="feed_16x16.png"></img>
                </a>
                <a wicket:id="summary"><wicket:message key="gb.summary"></wicket:message></a> | <a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a> | <a wicket:id="branches"><wicket:message key="gb.branches"></wicket:message></a> | <a wicket:id="tags"><wicket:message key="gb.tags"></wicket:message></a> | <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a> <span wicket:id="extra"><span wicket:id="extraSeparator"></span><span wicket:id="extraLink"></span></span>
            </div>
            </div>
        </div>
        
        <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
        <div style="text-align:center;padding-top:5px;" wicket:id="feedback">[Feedback Panel]</div>
        <!-- page header -->
        <div class="page-header">
            <h2><span wicket:id="repositoryName">[repository name]</span> <small><span wicket:id="pageName">[page name]</span></small></h2>
        </div>
    
        <!-- page content -->
        <wicket:child />
src/com/gitblit/wicket/pages/RepositoryPage.java
@@ -69,6 +69,7 @@
        private static final long serialVersionUID = 1L;
        {
            put("repositories", new PageRegistration("gb.repositories", RepositoriesPage.class, false));
            put("summary", new PageRegistration("gb.summary", SummaryPage.class));
            put("log", new PageRegistration("gb.log", LogPage.class));
            put("branches", new PageRegistration("gb.branches", BranchesPage.class));
@@ -93,6 +94,7 @@
        RepositoryModel model = getRepositoryModel();
        // standard page links
        addRegisteredPageLink("repositories");
        addRegisteredPageLink("summary");
        addRegisteredPageLink("log");
        addRegisteredPageLink("branches");
@@ -133,10 +135,8 @@
            public void populateItem(final Item<String> item) {
                String extra = item.getModelObject();
                PageRegistration pageReg = registeredPages.get(extra);
                item.add(new Label("extraSeparator", " | "));
                item.add(new LinkPanel("extraLink", null, getString(pageReg.translationKey),
                        pageReg.pageClass, WicketUtils.newRepositoryParameter(repositoryName))
                        .setEnabled(!extra.equals(pageWicketId)));
                        pageReg.pageClass, WicketUtils.newRepositoryParameter(repositoryName)));
            }
        };
        add(extrasView);
@@ -156,6 +156,15 @@
        setStatelessHint(true);
    }
    @Override
    protected void setupPage(String repositoryName, String pageName) {
        add(new LinkPanel("repositoryName", null, repositoryName, SummaryPage.class,
                WicketUtils.newRepositoryParameter(repositoryName)));
        add(new Label("pageName", pageName));
        super.setupPage(repositoryName, pageName);
    }
    public String getLinkWicketId(String pageName) {
        for (String wicketId : registeredPages.keySet()) {
            String key = registeredPages.get(wicketId).translationKey;
@@ -172,15 +181,20 @@
        if (!StringUtils.isEmpty(wicketId)) {
            Component c = get(wicketId);
            if (c != null) {
                c.setEnabled(false);
//                c.setEnabled(false);
//                WicketUtils.setCssClass(c, "selected");
            }
        }
    }
    private void addRegisteredPageLink(String key) {
        PageRegistration pageReg = registeredPages.get(key);
        if (pageReg.repositoryLink) {
        add(new BookmarkablePageLink<Void>(key, pageReg.pageClass,
                WicketUtils.newRepositoryParameter(repositoryName)));
        } else {
            add(new BookmarkablePageLink<Void>(key, pageReg.pageClass));
        }
    }
    protected void addSyndicationDiscoveryLink() {
@@ -335,10 +349,16 @@
        final String translationKey;
        final Class<? extends BasePage> pageClass;
        final boolean repositoryLink;
        PageRegistration(String translationKey, Class<? extends BasePage> pageClass) {
            this(translationKey, pageClass, true);
        }
        PageRegistration(String translationKey, Class<? extends BasePage> pageClass, boolean repositoryLink) {
            this.translationKey = translationKey;
            this.pageClass = pageClass;
            this.repositoryLink = repositoryLink;
        }
    }
@@ -364,7 +384,7 @@
        void setTranslatedAttributes() {
            WicketUtils.setHtmlTooltip(get("searchType"), getString("gb.searchTypeTooltip"));
            WicketUtils.setHtmlTooltip(get("searchBox"), getString("gb.searchTooltip"));
            WicketUtils.setHtmlTooltip(get("searchBox"), MessageFormat.format(getString("gb.searchTooltip"), repositoryName));
            WicketUtils.setInputPlaceholder(get("searchBox"), getString("gb.search"));
        }
@@ -372,6 +392,10 @@
        public void onSubmit() {
            SearchType searchType = searchTypeModel.getObject();
            String searchString = searchBoxModel.getObject();
            if (searchString == null) {
                // FIXME IE intermittently has no searchString. Wicket bug?
                return;
            }
            for (SearchType type : SearchType.values()) {
                if (searchString.toLowerCase().startsWith(type.name().toLowerCase() + ":")) {
                    searchType = type;
src/com/gitblit/wicket/pages/ReviewProposalPage.html
@@ -6,11 +6,6 @@
<body>
<wicket:extend>
    <div style="padding-top:20px"></div>
    <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
    <!-- proposal info -->
    <table class="plain">
        <tr><th><wicket:message key="gb.received">received</wicket:message></th><td><span wicket:id="received">[received]</span></td></tr>
@@ -21,7 +16,7 @@
        <tr><th valign="top"><wicket:message key="gb.proposal">proposal</wicket:message></th><td><span class="sha1" wicket:id="definition">[definition]</span></td></tr>
    </table>
        
    <div wicket:id="repositories"></div>
    <div wicket:id="repositoriesPanel"></div>
    
</wicket:extend>    
</body>
src/com/gitblit/wicket/pages/ReviewProposalPage.java
@@ -33,7 +33,7 @@
import com.gitblit.wicket.panels.RepositoriesPanel;
@RequiresAdminRole
public class ReviewProposalPage extends BasePage {
public class ReviewProposalPage extends RootSubPage {
    private final String PROPS_PATTERN = "{0} = {1}\n";
@@ -42,9 +42,6 @@
    public ReviewProposalPage(PageParameters params) {
        super(params);
        setupPage("", getString("gb.proposals"));
        setStatelessHint(true);
        final String token = WicketUtils.getToken(params);
        FederationProposal proposal = GitBlit.self().getPendingFederationProposal(token);
@@ -52,13 +49,15 @@
            error("Could not find federation proposal!", true);
        }
        setupPage(getString("gb.proposals"), proposal.url);
        add(new Label("url", proposal.url));
        add(new Label("message", proposal.message));
        add(WicketUtils.createTimestampLabel("received", proposal.received, getTimeZone()));
        add(new Label("token", proposal.token));
        add(new Label("tokenType", proposal.tokenType.name()));
        boolean go = true;
        String p;
        if (GitBlit.isGO()) {
            // gitblit.properties definition
@@ -92,7 +91,7 @@
        List<RepositoryModel> repositories = new ArrayList<RepositoryModel>(
                proposal.repositories.values());
        RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositories", false,
        RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositoriesPanel", false,
                repositories, getAccessRestrictions());
        add(repositoriesPanel);
    }
src/com/gitblit/wicket/pages/RootPage.html
New file
@@ -0,0 +1,38 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
      xml:lang="en"
      lang="en">
<body>
<wicket:extend>
    <div class="topbar">
        <div class="fill">
            <div class="container">
                <a class="brand" wicket:id="rootLink">
                    <img src="gitblt_25_white.png" width="79" height="25" alt="gitblit" class="logo"/>
                </a>
                <ul class="nav">
                    <li><a wicket:id="repositories"><wicket:message key="gb.repositories"></wicket:message></a></li>
                    <li><a wicket:id="users"><wicket:message key="gb.users"></wicket:message></a></li>
                    <li><a wicket:id="federation"><wicket:message key="gb.federation"></wicket:message></a></li>
                </ul>
                <form class="pull-right" wicket:id="loginForm">
                    <div class="login">
                        <input wicket:id="username" class="input-small" type="text" />
                        <input wicket:id="password" class="input-small" type="password" />
                        <button class="btn primary" type="submit"><wicket:message key="gb.login"></wicket:message></button>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <div style="text-align:center;padding-top:5px;" wicket:id="feedback">[Feedback Panel]</div>
    <!-- subclass content -->
    <wicket:child/>
</wicket:extend>
</body>
</html>
src/com/gitblit/wicket/pages/RootPage.java
New file
@@ -0,0 +1,156 @@
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.wicket.pages;
import java.text.MessageFormat;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.WebResponse;
import com.gitblit.Constants;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.models.UserModel;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
/**
 * Root page is a topbar, navigable page like Repositories, Users, or
 * Federation.
 *
 * @author James Moger
 *
 */
public abstract class RootPage extends BasePage {
    boolean showAdmin;
    IModel<String> username = new Model<String>("");
    IModel<String> password = new Model<String>("");
    public RootPage() {
        super();
    }
    public RootPage(PageParameters params) {
        super(params);
    }
    @Override
    protected void setupPage(String repositoryName, String pageName) {
        if (GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
            boolean allowAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
            showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
            // authentication requires state and session
            setStatelessHint(false);
        } else {
            showAdmin = GitBlit.getBoolean(Keys.web.allowAdministration, false);
            if (GitBlit.getBoolean(Keys.web.authenticateViewPages, false)) {
                // authentication requires state and session
                setStatelessHint(false);
            } else {
                // no authentication required, no state and no session required
                setStatelessHint(true);
            }
        }
        boolean showRegistrations = GitBlit.canFederate()
                && GitBlit.getBoolean(Keys.web.showFederationRegistrations, false);
        // navigation links
        add(new BookmarkablePageLink<Void>("repositories", RepositoriesPage.class));
        add(new BookmarkablePageLink<Void>("users", UsersPage.class).setVisible(showAdmin));
        add(new BookmarkablePageLink<Void>("federation", FederationPage.class).setVisible(showAdmin
                || showRegistrations));
        // login form
        StatelessForm<Void> loginForm = new StatelessForm<Void>("loginForm") {
            private static final long serialVersionUID = 1L;
            @Override
            public void onSubmit() {
                String username = RootPage.this.username.getObject();
                char[] password = RootPage.this.password.getObject().toCharArray();
                UserModel user = GitBlit.self().authenticate(username, password);
                if (user == null) {
                    error("Invalid username or password!");
                } else if (user.username.equals(Constants.FEDERATION_USER)) {
                    // disallow the federation user from logging in via the
                    // web ui
                    error("Invalid username or password!");
                    user = null;
                } else {
                    loginUser(user);
                }
            }
        };
        TextField<String> unameField = new TextField<String>("username", username);
        WicketUtils.setInputPlaceholder(unameField, getString("gb.username"));
        loginForm.add(unameField);
        PasswordTextField pwField = new PasswordTextField("password", password);
        WicketUtils.setInputPlaceholder(pwField, getString("gb.password"));
        loginForm.add(pwField);
        add(loginForm);
        if (GitBlit.getBoolean(Keys.web.authenticateViewPages, true)
                || GitBlit.getBoolean(Keys.web.authenticateAdminPages, true)) {
            loginForm.setVisible(!GitBlitWebSession.get().isLoggedIn());
        } else {
            loginForm.setVisible(false);
        }
        // display an error message cached from a redirect
        String cachedMessage = GitBlitWebSession.get().clearErrorMessage();
        if (!StringUtils.isEmpty(cachedMessage)) {
            error(cachedMessage);
        } else if (showAdmin) {
            int pendingProposals = GitBlit.self().getPendingFederationProposals().size();
            if (pendingProposals == 1) {
                info("There is 1 federation proposal awaiting review.");
            } else if (pendingProposals > 1) {
                info(MessageFormat.format("There are {0} federation proposals awaiting review.",
                        pendingProposals));
            }
        }
        super.setupPage(repositoryName, pageName);
    }
    private void loginUser(UserModel user) {
        if (user != null) {
            // Set the user into the session
            GitBlitWebSession.get().setUser(user);
            // Set Cookie
            if (GitBlit.getBoolean(Keys.web.allowCookieAuthentication, false)) {
                WebResponse response = (WebResponse) getRequestCycle().getResponse();
                GitBlit.self().setCookie(response, user);
            }
            if (!continueToOriginalDestination()) {
                // Redirect to home page
                setResponsePage(getApplication().getHomePage());
            }
        }
    }
}
src/com/gitblit/wicket/pages/RootSubPage.html
New file
@@ -0,0 +1,18 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
      xml:lang="en"
      lang="en">
<body>
<wicket:extend>
    <!-- page header -->
    <div class="page-header">
        <h2><span wicket:id="pageName">[page name]</span> <small><span wicket:id="pageSubName">[sub name]</span></small></h2>
    </div>
    <!-- Subclass Content -->
    <wicket:child/>
</wicket:extend>
</body>
</html>
src/com/gitblit/wicket/pages/RootSubPage.java
New file
@@ -0,0 +1,48 @@
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.wicket.pages;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import com.gitblit.utils.StringUtils;
/**
 * RootSubPage is a non-topbar navigable RootPage. It also has a page header.
 *
 * @author James Moger
 *
 */
public abstract class RootSubPage extends RootPage {
    public RootSubPage() {
        super();
    }
    public RootSubPage(PageParameters params) {
        super(params);
    }
    @Override
    protected void setupPage(String pageName, String subName) {
        add(new Label("pageName", pageName));
        if (!StringUtils.isEmpty(subName)) {
            subName = "/ " + subName;
        }
        add(new Label("pageSubName", subName));
        super.setupPage("", pageName);
    }
}
src/com/gitblit/wicket/pages/SendProposalPage.html
@@ -6,25 +6,19 @@
<wicket:extend>
<body onload="document.getElementById('myUrl').focus();">
    <div style="padding-top:20px"></div>
    <div style="text-align:center;" wicket:id="feedback">[Feedback Panel]</div>
    <!-- proposal info -->
    <form wicket:id="editForm">
    <table class="plain">
        <tr><th><wicket:message key="gb.url">url</wicket:message></th><td class="edit"><input type="text" wicket:id="myUrl" id="myUrl" size="60" />  &nbsp;<i><wicket:message key="gb.myUrlDescription"></wicket:message></i></td></tr>
        <tr><th><wicket:message key="gb.destinationUrl">destination url</wicket:message></th><td class="edit"><input type="text" wicket:id="destinationUrl" size="60" /> &nbsp;<i><wicket:message key="gb.destinationUrlDescription"></wicket:message></i></td></tr>
        <tr><th valign="top"><wicket:message key="gb.message">message</wicket:message></th><td class="edit"><input type="text" wicket:id="message" size="80" /></td></tr>
        <tr><th><wicket:message key="gb.url">url</wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="myUrl" id="myUrl" size="60" />  &nbsp;<i><wicket:message key="gb.myUrlDescription"></wicket:message></i></td></tr>
        <tr><th><wicket:message key="gb.destinationUrl">destination url</wicket:message></th><td class="edit"><input class="span6" type="text" wicket:id="destinationUrl" size="60" /> &nbsp;<i><wicket:message key="gb.destinationUrlDescription"></wicket:message></i></td></tr>
        <tr><th valign="top"><wicket:message key="gb.message">message</wicket:message></th><td class="edit"><input class="span8" type="text" wicket:id="message" size="80" /></td></tr>
        <tr><th><wicket:message key="gb.type">type</wicket:message></th><td><span wicket:id="tokenType">[token type]</span></td></tr>
        <tr><th><wicket:message key="gb.token">token</wicket:message></th><td><span class="sha1" wicket:id="token">[token]</span></td></tr>
        <tr><th></th><td class="editButton"><input type="submit" value="propose" wicket:message="value:gb.sendProposal" wicket:id="save" /> <input type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /></td></tr>
        <tr><th></th><td class="editButton"><input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /> <input class="btn primary" type="submit" value="propose" wicket:message="value:gb.sendProposal" wicket:id="save" /> </td></tr>
    </table>
    </form>
    
    <div style="padding-top:10px;" wicket:id="repositories"></div>
    <div style="padding-top:10px;" wicket:id="repositoriesPanel"></div>
</body>
</wicket:extend>    
</html>
src/com/gitblit/wicket/pages/SendProposalPage.java
@@ -37,7 +37,7 @@
import com.gitblit.wicket.panels.RepositoriesPanel;
@RequiresAdminRole
public class SendProposalPage extends BasePage {
public class SendProposalPage extends RootSubPage {
    public String myUrl;
@@ -48,7 +48,7 @@
    public SendProposalPage(PageParameters params) {
        super(params);
        setupPage("", getString("gb.sendProposal"));
        setupPage(getString("gb.sendProposal"), "");
        setStatelessHint(true);
        final String token = WicketUtils.getToken(params);
@@ -139,7 +139,7 @@
            @Override
            public void onSubmit() {
                setResponsePage(RepositoriesPage.class);
                setResponsePage(FederationPage.class);
            }
        };
        cancel.setDefaultFormProcessing(false);
@@ -148,7 +148,7 @@
        List<RepositoryModel> repositories = new ArrayList<RepositoryModel>(
                proposal.repositories.values());
        RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositories", false,
        RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositoriesPanel", false,
                repositories, getAccessRestrictions());
        add(repositoriesPanel);
    }
src/com/gitblit/wicket/pages/TicketPage.html
@@ -8,7 +8,7 @@
<wicket:extend>
    <!-- ticket title -->
    <div style="font-size:150%;padding-top:5px;" wicket:id="ticketTitle">[ticket title]</div>
    <div style="font-size:150%;padding-top:5px;padding-bottom:5px;" wicket:id="ticketTitle">[ticket title]</div>
        
    <!-- ticket info -->
    <table class="plain">
src/com/gitblit/wicket/pages/TicketPage.java
@@ -34,7 +34,7 @@
    public TicketPage(PageParameters params) {
        super(params);
        final String ticketFolder = WicketUtils.getPath(params);
        final String ticketFolder = WicketUtils.getObject(params);
        Repository r = getRepository();
        TicketModel t = TicgitUtils.getTicket(r, ticketFolder);
src/com/gitblit/wicket/pages/UsersPage.html
New file
@@ -0,0 +1,11 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
      xml:lang="en"
      lang="en">
<body>
<wicket:extend>
    <div wicket:id="usersPanel">[users panel]</div>
</wicket:extend>
</body>
</html>
src/com/gitblit/wicket/pages/UsersPage.java
New file
@@ -0,0 +1,30 @@
/*
 * Copyright 2011 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitblit.wicket.pages;
import com.gitblit.wicket.RequiresAdminRole;
import com.gitblit.wicket.panels.UsersPanel;
@RequiresAdminRole
public class UsersPage extends RootPage {
    public UsersPage() {
        super();
        setupPage("", "");
        add(new UsersPanel("usersPanel", showAdmin).setVisible(showAdmin));
    }
}
src/com/gitblit/wicket/panels/BranchesPanel.html
@@ -8,7 +8,7 @@
<wicket:panel>
    <!-- header -->
    <div class="header"><img style="vertical-align: top;" src="commit_branch_16x16.png"></img><span wicket:id="branches">[branches header]</span></div>
    <div class="header"><img style="vertical-align: middle;" src="commit_branch_16x16.png"></img><span wicket:id="branches">[branches header]</span></div>
    
    <table class="pretty">
        <tbody>
src/com/gitblit/wicket/panels/FederationProposalsPanel.html
@@ -10,7 +10,7 @@
        <table class="repositories">
        <tr>
            <th class="left">
                <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
                <img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
                <wicket:message key="gb.proposals">[proposals]</wicket:message>
            </th>
            <th><wicket:message key="gb.received">[received]</wicket:message></th>
src/com/gitblit/wicket/panels/FederationRegistrationsPanel.html
@@ -10,7 +10,7 @@
    <table class="repositories">
        <tr>
            <th class="left">
                <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
                <img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
                <wicket:message key="gb.registrations">[registrations]</wicket:message>
            </th>
            <th><wicket:message key="gb.name">[name]</wicket:message></th>
src/com/gitblit/wicket/panels/FederationTokensPanel.html
@@ -15,7 +15,7 @@
        <table class="repositories">
        <tr>
            <th class="left">
                <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
                <img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="federated_16x16.png"/>
                <wicket:message key="gb.tokens">[tokens]</wicket:message>
            </th>
            <th></th>
src/com/gitblit/wicket/panels/LogPanel.html
@@ -8,7 +8,7 @@
<wicket:panel>
    <!-- header -->    
    <div class="header"><img style="vertical-align: top;" src="commit_changes_16x16.png"></img><span wicket:id="header">[log header]</span></div>
    <div class="header"><img style="vertical-align: middle;" src="commit_changes_16x16.png"></img><span wicket:id="header">[log header]</span></div>
    <table class="pretty">
        <tbody>
               <tr wicket:id="commit">
src/com/gitblit/wicket/panels/PathBreadcrumbsPanel.html
@@ -7,9 +7,11 @@
<wicket:panel>
    <!-- page path links -->
    <div class="page_path">    
        <span wicket:id="path">
            <span wicket:id="pathLink"></span> <span wicket:id="pathSeparator"></span>
        </span>
        <ul class="breadcrumb">
            <li wicket:id="path">
                <span wicket:id="pathLink"></span> <span class="divider" wicket:id="pathSeparator"></span>
            </li>
        </ul>
    </div>
</wicket:panel>
</html>
src/com/gitblit/wicket/panels/RepositoriesPanel.html
@@ -21,7 +21,7 @@
    <wicket:fragment wicket:id="adminLinks">
        <!-- page nav links -->    
        <div class="admin_nav">
            <img style="vertical-align: top;" src="add_16x16.png"/>
            <img style="vertical-align: middle;" src="add_16x16.png"/>
            <a wicket:id="newRepository">
                <wicket:message key="gb.newRepository"></wicket:message>
            </a>
@@ -39,7 +39,7 @@
    <wicket:fragment wicket:id="flatRepositoryHeader">
        <tr>
            <th class="left" wicket:id="orderByRepository">
                <img style="vertical-align: top; border: 1px solid #888;" src="gitweb-favicon.png"/>
                <img style="vertical-align: middle; border: 1px solid #888;" src="gitweb-favicon.png"/>
                <wicket:message key="gb.repository">Repository</wicket:message>
            </th>
            <th wicket:id="orderByDescription"><wicket:message key="gb.description">Description</wicket:message></th>
@@ -54,7 +54,7 @@
    <wicket:fragment wicket:id="groupRepositoryHeader">
        <tr>
            <th class="left">
                <img style="vertical-align: top; border: 1px solid #888;" src="gitweb-favicon.png"/>
                <img style="vertical-align: middle; border: 1px solid #888;" src="gitweb-favicon.png"/>
                <wicket:message key="gb.repository">Repository</wicket:message>
            </th>
            <th><wicket:message key="gb.description">Description</wicket:message></th>
@@ -71,7 +71,7 @@
    </wicket:fragment>
        
    <wicket:fragment wicket:id="repositoryRow">
        <td class="left"><div class="list" wicket:id="repositoryName">[repository name]</div></td>
        <td class="left" style="padding-left:10px;" ><div class="list" wicket:id="repositoryName">[repository name]</div></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>
src/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -124,6 +124,7 @@
        DataView<RepositoryModel> dataView = new DataView<RepositoryModel>("row", dp) {
            private static final long serialVersionUID = 1L;
            int counter;
            String currGroupName;
            @Override
            protected void onBeforeRender() {
@@ -134,23 +135,32 @@
            public void populateItem(final Item<RepositoryModel> item) {
                final RepositoryModel entry = item.getModelObject();
                if (entry instanceof GroupRepositoryModel) {
                    currGroupName = entry.name;
                    Fragment row = new Fragment("rowContent", "groupRepositoryRow", this);
                    item.add(row);
                    row.add(new Label("groupName", entry.toString()));
                    WicketUtils.setCssClass(item, "group");
                    // reset counter so that first row is light background
                    counter = 0;
                    return;
                }
                Fragment row = new Fragment("rowContent", "repositoryRow", this);
                item.add(row);
                // try to strip group name for less cluttered list
                String repoName = entry.name;
                if (!StringUtils.isEmpty(currGroupName) && (repoName.indexOf('/') > -1)) {
                    repoName = repoName.substring(currGroupName.length() + 1);
                }
                if (entry.hasCommits && linksActive) {
                    PageParameters pp = WicketUtils.newRepositoryParameter(entry.name);
                    row.add(new LinkPanel("repositoryName", "list", entry.name, SummaryPage.class,
                            pp));
                    row.add(new LinkPanel("repositoryName", "list", repoName, SummaryPage.class, pp));
                    row.add(new LinkPanel("repositoryDescription", "list", entry.description,
                            SummaryPage.class, pp));
                } else {
                    // new/empty repository OR proposed repository
                    row.add(new Label("repositoryName", entry.name));
                    row.add(new Label("repositoryName", repoName));
                    row.add(new Label("repositoryDescription", entry.description));
                }
src/com/gitblit/wicket/panels/TagsPanel.html
@@ -8,7 +8,7 @@
<wicket:panel>
    <!-- tags -->
    <div class="header"><img style="vertical-align: top;" src="tag_16x16.png"></img><span wicket:id="header">[tags header]</span></div>
    <div class="header"><img style="vertical-align: middle;" src="tag_16x16.png"></img><span wicket:id="header">[tags header]</span></div>
    <table class="pretty">
        <tbody>
            <tr wicket:id="tag">
src/com/gitblit/wicket/panels/UsersPanel.html
@@ -12,7 +12,7 @@
        <table class="repositories">
        <tr>
            <th class="left">
                <img style="vertical-align: top; border: 1px solid #888; background-color: white;" src="user_16x16.png"/>
                <img style="vertical-align: middle; border: 1px solid #888; background-color: white;" src="user_16x16.png"/>
                <wicket:message key="gb.username">[username]</wicket:message>
            </th>
            <th class="right"></th>
@@ -28,7 +28,7 @@
    <wicket:fragment wicket:id="adminLinks">
        <!-- page nav links -->    
        <div class="admin_nav">
            <img style="vertical-align: top;" src="add_16x16.png"/>
            <img style="vertical-align: middle;" src="add_16x16.png"/>
            <a wicket:id="newUser">
                <wicket:message key="gb.newUser"></wicket:message>
            </a>