/*
 * 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.
 */
.img-title {
    text-align: center
}

.img {
    text-align: center
}

.special-td {
    font-family: Arial;
    font-size: 10pt;
    font-weight: bold
}

.special {
    font-family: Arial;
    font-weight: bold;
    border-style: solid;
    border-width: 1;
    padding-left: 4;
    padding-right: 4;
    padding-top: 1;
    padding-bottom: 1;
    background-color: #C0C0C0;
    font-size: 10pt
}

.xml {
    font-family: Arial;
    font-size: 10pt;
    color: #0000FF;
    font-style: italic
}

/*
.code {
    font-family: Courier New;
    font-size: 10pt;
    color: #800000
}
*/

/*
-----------------------------------------------------------------------
Generic element styles
----------------------------------------------------------------------- */
body {
    color: #111;
    font-family: "Trebuchet MS", Verdana, sans-serif;
    font-size: 1em;
    padding: 5;
    padding-bottom:0px;
    border-width: 0;
    outline-width: 0;
    list-style-position: outside;
    display: block;

    margin: 0 auto; /* center, not in IE5 */
    height: auto !important; /* real browsers */
    height: 100%; /* IE6: treaded as min-height*/

    min-height: 100%; /* real browsers */
    width: 980px;
    background-image: url(../images/home-top.gif);
    background-position: left top;
    background-repeat: repeat-x;
}

#breadcrumbs {
    background-image: url(../images/menu-back.gif);
    background-position: left top;
    background-repeat: repeat-x;
    border-bottom: solid 1px #d4d4d4;
    height: 28px;
    font-size: 0.8em;
    background-color: transparent;
    border: 1px solid #6895c2;
}

#banner{
    margin-top:10px;
    padding-top:10px;
    padding-bottom:10px;
}
#bannerLeft{
    background-image: url(../images/apache-rampart-logo.jpg);
    background-position: left top;
    background-repeat: no-repeat;	
    text-indent:-1700px;/*We do this to hide the text. This needs to be updated to a beter solution.*/
    width:204px;
    height:56px;
    display:block;
    float:left;
}
#bannerRight{
    display:block;
    float:right;
    height:51px;
    width:537px;
}
.xright, #bannerRight {
    text-shadow: none;
}

#leftColumn {
    border: none;
    background-color: transparent;
    margin: 1em 0 0 0;
}

#navcolumn {
    padding: 0;
}

#navcolumn h5 {
    background-color: #e8f4ff;
    border-left: solid 1px #ff2700;
    border-bottom: none;
    font-size: 0.9em;
    padding: 5px;
    color: #333333;
    font-weight: normal;
}

#navcolumn li {
    font-size: 0.9em;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
}

#bodyColumn {
    margin-left: 190px;
    margin-right: 0;
}

#contentBox {
    color: #333333;
}

#contentBox p, #contentBox td, #contentBox li {
    font-family: "Trebuchet MS", Verdana, sans-serif;
	line-height: 1.5em;
    font-size: 0.94em;
}

#contentBox p, #contentBox li {
    text-align: justify;
}

a:link {
    color: #039;
}

a:hover {
    color: #03c;
    text-decoration: none;
}

a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
    background: none;
    padding: 0;
}

table.bodyTable th {
    background-color: #6f8aa5;
}

table.bodyTable tr.a {
    background-color: #d1dce7;
}

table.bodyTable tr.b {
    background-color: #eceef1;
}

h1 {
    color: #4f4f4f;
    font-size: 2.5em;
    font-weight: normal;
}

h2 {
    color: #646b71;
    font-size: 1.7em;
    background-color: transparent;
    border: none;
    padding: 0;
    font-weight: normal;
}

h3 {
    color: #7d858d;
	font-weight: bold;
    font-size: 1.2em;
    background-color: transparent;
    border: none;
    padding: 0;
}

h4 {
    color: #333333;
    font-size: 1em;
    font-weight: bold;
    background-color: transparent;
    border: none;
    padding: 0;
}

th {
    background-color: #f5f5f5;
    height: 20;
    paddong: 0px;
    spacing: 0px;
}

table {
    margin: 0;
    padding: 0;
    border: solid 0 #dcdcdc;
}

.header {
    height: 80px;
    background-image: url( ../images/doc_header.jpg );
    background-repeat: no-repeat;
    background-attachment: scroll;
    background-position: left top;
}

pre, div.source {
    border: 1px dotted;
    background-color: #e2ecf6;
    padding: 0.8em;
    margin: 0;
    overflow: auto;
    font-size: 0.9em;
}

/* Xdoc generates <div class="source"><pre>...</pre></div> for <source> elements.
   Because we already apply styles to every <pre>, we need to suppress styles here. */
div.source pre {
    border: none;
    background-color: transparent;
    padding: none;
}
#footer{
    background-color:#E9E9E9;
    color:#828282;
    left:0;
    padding-top:10px;
    text-indent:10px;
    width:100%;
    height:100px;
}