/*
 * 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.
 */

body {
  background-color: #fff;
  font-family: Verdana, Helvetica, Arial, sans-serif;
  margin-left: auto;
  margin-right: auto;
  background-repeat: repeat-y;
  font-size: 13px;
  padding: 0px;
}
td, select, input, li{
  font-family: Verdana, Helvetica, Arial, sans-serif;
  font-size: 12px;
  color:#333333;
}
code{
  font-size: 12px;
}
a {
  text-decoration: none;
}
a:link {
  color:#47a;
}
a:visited {
  color:#68a;
}
a:active, a:hover {
  color:#990000;
}
#legend li.externalLink {
  background: url(../images/external.png) left top no-repeat;
  padding-left: 18px;
}
a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
  background: url(../images/external.png) right center no-repeat;
  padding-right: 18px;
}
#legend li.newWindow {
  background: url(../images/newwindow.png) left top no-repeat;
  padding-left: 18px;
}
a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover {
  background: url(../images/newwindow.png) right center no-repeat;
  padding-right: 18px;
}
h2 {
  font-size: 17px;
  color: #333333;
}
h3 {
  padding: 4px 4px 4px 24px;
  color: #666;
  background-color: #ccc;
  font-weight: bold;
  font-size: 14px;
  background-image: url(../images/h3.jpg);
  background-repeat: no-repeat;
  background-position: left bottom;
}
p {
  line-height: 1.3em;
  font-size: 12px;
  color: #000;
}
#breadcrumbs {
  height: 13px;
  background-image: url(../images/breadcrumbs.jpg);
  padding: 5px 10px 14px 20px;
}
* html #breadcrumbs {
  padding-bottom: 8px;
}
#leftColumn {
  margin: 10px 0 10px 0;
  border-top-color: #ccc;
  border-top-style: solid;
  border-top-width: 1px;
  border-right-color: #ccc;
  border-right-style: solid;
  border-right-width: 1px;
  border-bottom-color: #ccc;
  border-bottom-style: solid;
  border-bottom-width: 1px;
  padding-right: 5px;
  padding-left: 5px;
}
#navcolumn h5 {
  font-size: smaller;
  border-bottom: 1px solid #aaaaaa;
  padding-top: 2px;
  padding-left: 9px;
  color: #49635a;
  background-image: url(../images/h5.jpg);
  background-repeat: no-repeat;
  background-position: left bottom;
}

table.bodyTable th {
  color: white;
  background-color: #bbb;
  text-align: left;
  font-weight: bold;
}

table.bodyTable th, table.bodyTable td {
  font-size: 11px;
}

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

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

table.bodyTable tr.a:hover, table.bodyTable tr.b:hover {
  background: #dfe3db;
}

.source {
  border: 1px solid #999;
  overflow:auto
}
dt {
  padding: 4px 4px 4px 24px;
  color: #333333;
  background-color: #ccc;
  font-weight: bold;
  font-size: 14px;
  background-image: url(../images/h3.jpg);
  background-repeat: no-repeat;
  background-position: left bottom;
}
.subsectionTitle {
  font-size: 13px;
  font-weight: bold;
  color: #666;

}

table {
  font-size: 10px;
}
.xright a:link, .xright a:visited, .xright a:active {
  color: #666;
}
.xright a:hover {
  color: #003300;
}
#banner {
  height: 93px;
  background: url(../images/banner.jpg);
}
#navcolumn ul {
  margin: 5px 0 15px -0em;
}
#navcolumn ul a {
  color: #333333;
}
#navcolumn ul a:hover {
  color: red;
}
#intro {
  border: solid #ccc 1px;
  margin: 6px 0px 0px 0px;
  padding: 10px 40px 10px 40px;
}
.subsection {
  margin-left: 3px;
  color: #333333;
}

.subsection p {
  font-size: 12px;
}
#footer {
  padding: 10px;
  margin: 20px 0px 20px 0px;
  border-top: solid #ccc 1px;
  color: #333333;
}

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