/*
 * 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 {
	background-image: url(../images/nw_maj_rond.gif);
	background-repeat: no-repeat;
}

.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: #ddd;
	background-image: url(../images/sw_med_rond.gif);
}

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

.functnbar a, .functnbar2 a, .functnbar3 a {
	color: #000;
	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: blue;
}

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

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

#leftcol a, #breadcrumbs a {
	text-decoration: none;
}

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

.app h3 {
	background-color: #333;
}

.app h3 a:link, .app h3 a:visited, .app h4 a:link, .app h4 a:visited {
	color: #fff !important;
	text-decoration: underline;
}

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

.a td {
	background: #ddd;
}

.b td {
	background: #efefef;
}

.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;
}

.toolgroup .body {
	border-right: 1px solid #aaa;
	border-bottom: 1px solid #aaa;
}

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

#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;
}

#helptext .label {
	background-image: url(../images/icon_help_sml.gif);
	background-repeat: no-repeat;
	background-position: 97%;
}

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

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

#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: black;
}

.alert {
	background-color: #ff9;
}

.expandedwaste {
	background: url(../images/icon_arrowwaste2_sml.gif) no-repeat;
}

.collapsedwaste {
	background: url(../images/icon_arrowwaste1_sml.gif) no-repeat;
}

.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;
}

.collapsedwaste {
	background: url(../images/icon_arrowwaste1_sml.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, .donemessage, .infomessage {
	border-top: 5px solid #900;
	border-left: 1px solid #900;
	background-image: url(../images/icon_error_lrg.gif);
	background-repeat: no-repeat;
	background-position: 5px 1.33em;
}

.warningmessage {
	background-image: url(../images/icon_warning_lrg.gif);
	border-color: #c60;
}

.donemessage {
	background-image: url(../images/icon_success_lrg.gif);
	border-color: #090;
}

.infomessage {
	background-image: url(../images/icon_info_lrg.gif);
	border-color: #069;
}

.docinfo {
	background: url(../images/icon_doc_lrg.gif) no-repeat;
}

.dirinfo {
	background: url(../images/icon_folder_lrg.gif) no-repeat;
}

.memberinfo {
	background: url(../images/icon_members_lrg.gif) no-repeat;
}

.usergroupinfo {
	background: url(../images/icon_usergroups_lrg.gif) no-repeat;
}

.errormark, .warningmark, .donemark, .infomark {
	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);
}

.infomark {
	background-image: url(../images/icon_info_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, #helptext .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;
}

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;
}

#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 {
	padding: 5px;
	margin-right: 2px;
	margin-left: 2px;
}

.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 {
	margin-bottom: 6px;
}

.toolgroup .body {
	padding: 4px 4px 4px 0;
}

.toolgroup .label {
	padding: 4px;
}

.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, .expandedwaste, .collapsedwaste, .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, .donemessage, .infomessage, .docinfo, .dirinfo, .memberinfo, .usergroupinfo {
	margin: .67em 0;
	padding: .33em 0 .67em 42px;
	min-height: 32px;
}

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

.alt {
	display: none;
}

#banner h1 {
	margin: 0;
}

#leftcol {
	width: 14em;
}

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

#breadcrumbs {
	padding: 2px 8px;
}

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

.legend {
	float: right;
}

.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;
}
