/*
 * 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: auto;
  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,button,.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;
  font-style: normal;
  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;
}
