/*
 * 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:#666666;
}
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;
}

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