/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

/* $Id$
	
	This file defines basic default formatting for HTML conforming to Tigris application style. To extend or override these rules for your instance, edit inst.css instead of this file. */
  /* colors, backgrounds, borders, link indication */
body {
  background: #fff;
  color: #000;
}

.app h3,.app h4,.tabs td,.tabs th,.functnbar {
  
}

.functnbar,.functnbar2 {
  background-color: #aaa;
}

.functnbar2,.functnbar3 {
  background-color: #aaa;
  background-image: url(../images/sw_maj_rond.gif);
  background-repeat: no-repeat;
  background-position: bottom left;
}

.functnbar3 {
  background-color: #bbb;
  background-image: url(../images/sw_med_rond.gif);
}

.functnbar,.functnbar2,.functnbar3 {
  color: #333;
}

.functnbar a,.functnbar2 a,.functnbar3 a {
  color: #333;
  text-decoration: underline;
}

#navcolumn .body div,body.docs #toc li li {
  background-image: url(../images/strich.gif);
  background-repeat: no-repeat;
  background-position: .5em .5em;
}

#searchbox .body div,#navcolumn .body .heading {
  background-image: none;
}

a:link,#navcolumn a:visited,.app a:visited,.tasknav a:visited {
  color: #333;
}

a:link .selfref,a:visited .selfref {
  color: #555 !important;
  text-decoration: none;
}

a:active,a:hover,#leftcol a:active,#leftcol a:hover {
  color: #f30;
}

#leftcol a {
  text-decoration: none;
}

#breadcrumbs a:link {
  text-decoration: none;
}

#breadcrumbs a:visited {
  text-decoration: none;
  color: #333
}

#breadcrumbs a:hover {
  text-decoration: none;
  color: white
}

.app h3,.app h4 {
  color: #333;
}

.app h3 {
  background-image: url(../images/arrow.gif);
  background-repeat: no-repeat;
  background-position: left bottom;
  padding-bottom: 15px;
}

.app h3 a:link,.app h3 a:visited,.app h4 a:link,.app h4 a:visited {
  color: black !important;
  /* TODO was #fff causing white on white issues for me, so set it black */
  /*text-decoration: underline;*/
}

.app h4 {
  background-color: #888;
}

.a td {
  background: #ddd;
}

.b td {
  background: #eee;
}

.warning td {
  background: #cc0000;
}

.inputerror {
  background: #ffffcc;
}

table,th,td {
  border: none;
}

div.colbar {
  background: #eee;
  border-color: #999 #EEE #EEE #999;
  border-width: 1px;
  border-style: solid;
  /*}

.toolgroup {
	background: #efefef;
}

.toolgroup .label {
	border-bottom: 1px solid #666;
	border-right: 1px solid #666;
	background: #ddd;
	color: #555; */
}

#breadcrumbs {
  border-top: 1px solid #fff;
  background-color: #F3B455;
}

#main {
  border-top: 1px solid #999;
}

#rightcol div.www,#rightcol div.help {
  border: 1px solid #ddd;
}

body.docs div.docs {
  background-color: #fff;
  border-left: 1px solid #ddd;
  border-top: 1px solid #ddd;
}

body.docs {
  background: #eee url(../images/help_logo.gif) top right no-repeat !important;
}

.docs h3,.docs h4 {
  border-top: solid 1px #333;
}

#apphead h2 em {
  color: #777;
}

.app th {
  background-color: #bbb;
}

.tabs th {
  border-right: 1px solid #333;
  background-color: #ddd;
  color: #fff;
  border-left: 1px solid #fff;
}

.tabs td {
  background-color: #999;
  border-bottom: 1px solid #fff;
  border-right: 1px solid #fff;
  border-left: 1px solid #fff;
}

.tabs {
  border-bottom: 6px #ddd solid;
}

.tabs th,.tabs th a:link,.tabs th a:visited {
  color: #555;
}

.tabs td,.tabs td a:link,.tabs td a:visited {
  color: #fff;
}

.tabs a {
  text-decoration: none;
}

.axial th {
  background-color: #ddd;
  color: #555;
}

.alert {
  background-color: #ff9;
}

.filebrowse .expanded,.filebrowse-alt .expanded {
  background-image: url(../images/icon_arrowfolderopen2_sml.gif);
  background-repeat: no-repeat;
}

.filebrowse .collapsed,.filebrowse-alt .collapsed {
  background-image: url(../images/icon_arrowfolderclosed1_sml.gif);
  background-repeat: no-repeat;
}

.filebrowse .leafnode,.filebrowse-alt .leafnode {
  background-image: url(../images/icon_folder_sml.gif);
  background-repeat: no-repeat;
}

.filebrowse .leaf,.filebrowse-alt .leaf {
  background-image: url(../images/icon_doc_sml.gif);
  background-repeat: no-repeat;
}

.sortup {
  background: url(../images/icon_sortup.gif) no-repeat;
}

.sortdown {
  background: url(../images/icon_sortdown.gif) no-repeat;
}

body .grid td {
  border-top: 1px solid #ccc;
  border-left: 1px solid #ccc;
  background-color: transparent;
}

.confirm {
  color: #090;
}

.info {
  color: #069;
}

.errormessage,.warningmessage {
  background-repeat: no-repeat;
  background-position: 5px 1.33em;
  color: red;
}

.warningmessage {
  height: 48px;
  background-position: 0px 0px;
  background-color: white;
  border: 0px 0px 0px 0px;
  border-color: white;
  color: #333;
}

.errormark,.warningmark,.donemark {
  background: url(../images/icon_error_sml.gif) no-repeat;
}

.warningmark {
  background-image: url(../images/icon_warning_sml.gif);
}

.donemark {
  background-image: url(../images/icon_success_sml.gif);
}

.cvsdiff,.cvsblame {
  background-color: #ccc;
}

.cvsdiffadd {
  background-color: #afa;
}

.cvsdiffremove {
  background-color: #faa;
}

.cvsdiffchanges1 {
  background-color: #ff7;
}

.cvsdiffchanges2 {
  background-color: #ff7;
}

li.selection ul a {
  background: #fff;
}

.band1 {
  color: #fff;
  background-color: #663;
}

.band2 {
  color: #fff;
  background-color: #66C;
}

.band3 {
  background-color: #C99;
}

.band4 {
  background-color: #CFF;
}

.band5 {
  color: #fff;
  background-color: #336;
}

.band6 {
  color: #fff;
  background-color: #966;
}

.band7 {
  background-color: #9CC;
}

.band8 {
  background-color: #FFC;
}

.band9 {
  color: #fff;
  background-color: #633;
}

.band10 {
  color: #fff;
  background-color: #699;
}

.band11 {
  background-color: #CC9;
}

.band12 {
  background-color: #CCF;
}

.band13 {
  color: #fff;
  background-color: #366;
}

.band14 {
  color: #fff;
  background-color: #996;
}

.band15 {
  background-color: #99C;
}

.band16 {
  background-color: #FCC;
}

.app .helplink {
  cursor: help;
}

.legend th,.bars th {
  background-color: #fff;
}

/* font and text properties, exclusive of link indication, alignment, text-indent */
body,th,td,input,select {
  font-family: Verdana, Helvetica, Arial, sans-serif;
}

th {
  color: white
}

code,pre {
  font-family: 'Andale Mono', Courier, monospace;
}

body,.app h3,.app h4,#rightcol h3,pre,code,#apphead h2 small {
  font-size: x-small;
  voice-family: "\"}\"";
  voice-family: inherit;
  font-size: small;
}

small,div#footer,div#login,div.tabs th,div.tabs td,input,select,.paginate,.functnbar,.functnbar2,.functnbar3,#breadcrumbs,.courtesylinks,#rightcol div.help,.colbar,.tasknav,body.docs div#toc,#leftcol,.legend,.bars
  {
  font-size: xx-small;
  voice-family: "\"}\"";
  voice-family: inherit;
  font-size: x-small;
}

.tabs td,.tabs th,dt,.tasknav .selfref,#login .username,.selection {
  font-weight: bold;
}

li.selection ul {
  font-weight: normal;
}

h4,table {
  font-size: 1em;
}

#apphead h2 em {
  font-style: normal;
}

div.clear {
    clear: both;
    visibility: hidden;
}

div.clear hr {
    display: none;
}

#bannerLeft, #bannerRight {
    font-size: xx-large;
    font-weight: bold;
}

#bannerLeft img, #bannerRight img {
    margin: 0px;
}

.xleft, #bannerLeft img {
    float: left;
    text-shadow: #7CFC00;
}

.xright, #bannerRight img {
    float: right;
    text-shadow: #7CFC00;
}

#banner {
    padding: 0px;
}

#banner img {
    border: none;
}

#banner h1 {
  font-size: 1.25em;
}

/* box properties (exclusive of borders), positioning, alignments, list types, text-indent */
#bodycol h2 {
  margin-top: .3em;
  margin-bottom: .5em;
}

p,ul,ol,dl,.bars table {
  margin-top: .67em;
  margin-bottom: .67em;
}

h3,h4 {
  margin-bottom: 0;
}

form {
  margin: 0;
}

#bodycol {
  padding-left: 12px;
  padding-right: 12px;
  width: 100%;
  voice-family: "\"}\"";
  voice-family: inherit;
  width: auto;
}

html>body #bodycol {
  width: auto;
}

.docs {
  line-height: 1.4;
}

ol ol {
  list-style-type: lower-alpha;
}

ol ol ol {
  list-style-type: lower-roman;
}

.app h3,.app h4 {
  
}

.app h3 {
  border-bottom: 1px solid #DFDEDE;
  padding: 0px 0px 1px 23px;
  margin-bottom: 7px;
}

.app td,.app th {
  padding: 2px 3px;
}

.h3 p,.h4 p,.h3 dt,.h4 dt {
  margin-right: 7px;
  margin-left: 7px;
}

.tasknav {
  margin-bottom: 1.33em;
}

div.colbar {
  padding: 3px;
  margin: 2px 2px 0;
}

.tabs {
  margin-top: .67em;
  margin-right: 2px;
  margin-left: 2px;
  padding-left: 8px;
}

.tabs td,.tabs th {
  padding: 3px 9px;
}

#rightcol div.www,#rightcol div.help {
  padding: 0 .5em;
}

body.docs #toc {
  position: absolute;
  top: 15px;
  left: 0px;
  width: 120px;
  padding: 0 20px 0 0;
}

body.docs #toc ul,#toc ol {
  margin-left: 0;
  padding-left: 0;
}

body.docs #toc li {
  margin-top: 7px;
  padding-left: 10px;
  list-style-type: none;
}

body.docs div.docs {
  margin: 61px 0 0 150px;
  padding: 1em 2em 1em 1em !important;
}

.docs p+p {
  text-indent: 5%;
  margin-top: -.67em;
}

.docs h3,.docs h4 {
  margin-bottom: .1em;
  padding-top: .3em;
}

.functnbar,.functnbar2,.functnbar3 {
  padding: 5px;
  margin: .67em 2px;
}

.functnbar3 {
  margin-top: 0;
}

body {
  padding: 1em;
}

body.composite,body.docs {
  margin: 0;
  padding: 0;
}

th,td {
  text-align: left;
  vertical-align: top;
}

.right {
  text-align: right !important;
}

.center {
  text-align: center !important;
}

.axial th,.axial th .strut {
  text-align: right;
}

.app .axial td th {
  text-align: left;
}

body .stb {
  margin-top: 1em;
  text-indent: 0;
}

body .mtb {
  margin-top: 2em;
  text-indent: 0;
}

.courtesylinks {
  margin-top: 1em;
  padding-top: 1em;
}

dd {
  margin-bottom: .67em;
}

.toolgroup {
  padding: 6px 0px 0px 2px;
}

#legend {
  width: 161px;
  overflow: hidden;
  background: url(../images/legendbg.gif) 8px 0 no-repeat;
  display: block;
}

#litem1 {
  background: url(../images/buildnow.gif) 134px 5px no-repeat;
  padding-bottom: 8px;
}

#litem2 {
  background: url(../images/buildhistory.gif) 134px 5px no-repeat;
}

#litem3 {
  background: url(../images/building.gif) 134px 5px no-repeat;
}

#litem4 {
  background: url(../images/workingcopy.gif) 134px 5px no-repeat;
}

#litem5 {
  background: url(../images/checkingout.gif) 134px 5px no-repeat;
}

#litem6 {
  background: url(../images/inqueue.gif) 134px 5px no-repeat;
  padding-bottom: 8px;
}
#litem7 {
  background: url(../images/cancelbuild.gif) 134px 5px no-repeat;
}

#litem8 {
  background: url(../images/delete.gif) 134px 5px no-repeat;
}

#litem9 {
  background: url(../images/edit.gif) 134px 5px no-repeat;
}

#litem10 {
  background: url(../images/releaseproject.gif) 134px 5px no-repeat;
  padding-bottom: 8px;
}

#litem11 {
  background: url(../images/icon_success_sml.gif) 134px 5px no-repeat;
}

#litem12 {
  background: url(../images/icon_warning_sml.gif) 134px 5px no-repeat;
}

#litem13 {
  background: url(../images/icon_error_sml.gif) 134px 5px no-repeat;
}

#legend .body {
  font-size: 9px;
  text-indent: 19px;
  line-height: 24px;
  height: 25px;
  width: 161px;
  display: block;
}

.toolgroup .body {
  font-size: 9px;
  text-indent: 19px;
  line-height: 24px;
  height: 25px;
  width: 161px;
  overflow: hidden;
  background: url(../images/super.gif) 0 0 no-repeat;
  display: block;
}

.toolgroup .body a:link {
  height: 25px;
  width: 161px;
  color: #666;
  overflow: hidden;
  background: url(../images/super.gif) 0 0 no-repeat;
  display: block;
}

.toolgroup .body a:hover {
  font-size: 9px;
  text-indent: 19px;
  line-height: 24px;
  color: #fff !important;
  height: 25px;
  width: 161px;
  overflow: hidden;
  background: url(../images/super.gif) 0 -25px no-repeat;
  display: block;
}

.toolgroup .body a:active {
  font-size: 9px;
  text-indent: 19px;
  line-height: 24px;
  color: #fff !important;
  height: 25px;
  width: 161px;
  overflow: hidden;
  background: url(../images/super.gif) 0 -50px no-repeat;
  display: block;
}

.toolgroup .body a:visited {
  font-size: 9px;
  text-indent: 19px;
  line-height: 24px;
  color: #666;
  height: 25px;
  width: 161px;
  display: block;
}

.toolgroup .label {
  color: gray;
  font-weight: bold;
  font-size: 11px;
  padding: 0px 0px 1px 19px;
}

.toolgroup .body div {
  padding-bottom: .3em;
  padding-left: 1em;
}

.toolgroup .body div div {
  margin-top: .3em;
  padding-bottom: 0;
}

.tier1 {
  margin-left: 0;
}

.tier2 {
  margin-left: 1.5em;
}

.tier3 {
  margin-left: 3em;
}

.tier4 {
  margin-left: 4.5em;
}

.tier5 {
  margin-left: 6em;
}

.tier6 {
  margin-left: 7.5em;
}

.tier7 {
  margin-left: 9em;
}

.tier8 {
  margin-left: 10.5em;
}

.tier9 {
  margin-left: 12em;
}

.tier10 {
  margin-left: 13.5em;
}

.filebrowse .expanded,.filebrowse .collapsed {
  padding-left: 34px;
}

.filebrowse .leafnode,.filebrowse .leaf {
  padding-left: 20px;
}

.messagechild {
  padding-left: 34px;
}

.filebrowse-alt .expanded,.filebrowse-alt .collapsed,.filebrowse-alt .leaf,.filebrowse-alt .leafnode,.sortup,.sortdown
  { /* hide from macie5\*/
  float: left;
  /* resume */
  display: inline-block;
  height: 15px;
  width: 34px;
  padding-left: 0 !important;
}

.filebrowse-alt .leaf,.filebrowse-alt .leafnode,.sortup,.sortdown {
  width: 20px;
}

.filebrowse ul,.filebrowse-alt ul {
  list-style-type: none;
  padding-left: 0;
  margin-left: 0;
}

.filebrowse ul ul,.filebrowse-alt ul ul {
  margin-left: 1.5em;
  margin-top: 0;
  padding-top: .67em;
}

.filebrowse li,.filebrowse-alt li {
  margin-bottom: .67em;
}

td.filebrowse h3 {
  margin-top: 0;
}

.errormessage,.warningmessage {
  margin: .67em 0;
  padding: .33em 0 .67em 42px;
  min-height: 32px;
}

.errormark,.warningmark,.donemark {
  padding-left: 20px;
  min-height: 15px;
}

.alt {
  display: none;
}

#banner h1 {
  margin: 0;
}

#leftcol {
  width: 16em;
}

.axial th,.axial th .strut,#leftcol .strut {
  width: 12em;
}

#breadcrumbs {
  padding: 2px 8px;
}

.app h3,.app h4,.bars {
  clear: both;
}

.legend {
  float: left;
}

.legend th,.bars th {
  text-align: right;
  padding-left: 1em;
}

.bars table {
  table-layout: fixed;
}

.bars th {
  width: 12em;
}

#projectdocumentlist td.filebrowse-alt {
  padding-right: .75em;
}

.tablehead {
  color: #FFFFFF;
}

#footer {
  background: url(../images/footerborder.gif) 0 5px;
  padding: 10px 0px 8px 0px;
}

.composite #main #bodycol .app h2 {
	font-size: small;
}

.securityTable th {
    font-size: x-small;
}

.securityTable td {
    font-size: 13px;
}

/*
* Some extensions
*/
input[type="text"], input[type="password"], input[type="checkbox"] {
  color: #781351;  
  border: 1px solid #781351;
}

.errorLabel .required {
  color: red;
}

/* CSS sibling selector - highlight error text input */
tr [errorFor]+tr td input {
  border: 1px solid red;
}
