/*
 * 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, td, select, input, li{
  font-family: Verdana, Helvetica, Arial, sans-serif;
  font-size: 13px;
}
a {
  text-decoration: none;
}
a:link {
  color:#36a;
}
a:visited  {
  color:#47a;
}
a:active, a:hover {
  color:#69c;
}
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: 15px;
}
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 {
background-image: url(../images/h2-bg.gif); 
	background-repeat: repeat-x; 
	background-attachment: scroll; 
	background-position: left top; 
	height: 20px;
  padding: 4px 4px 4px 6px;
  border-bottom: 1px solid #cccccc;
  color: #333333;
  background-color: #ffffff;
  font-weight:900;
  font-size: large;
}
h3 {
padding: 4px 4px 2px 6px;
  border-bottom: 1px solid #cccccc;
  border-top: 0px solid #cccccc;
  border-left: 0px solid #cccccc;
  border-right: 0px solid #cccccc;
  color: #666666;
  font-weight: semi-bold;
  font-size: normal;
}
p {
  line-height: 1.3em;
  font-size: small;
}
#banner { 
	background-color: #ffffff; 
	border-bottom: 1px solid #fff; 
}
#breadcrumbs {
  border-top: 1px solid #aaa;
  background-image: url(../images/breadcrumbs-bg.gif); 
	background-repeat: repeat-x; 
	background-attachment: scroll; 
	background-position: left top; 
	height: 28px;
}
#leftColumn {
  margin: 5px 0 0 10px;
  border: 1px solid #b5b5b5;
  background-color: #ffffff;
  background-image: url(../images/leftcolumn-bg.gif); 
	background-repeat: repeat-x; 
	background-attachment: scroll; 
	background-position: left top;
}
#navcolumn h5 {
  font-size: smaller;
  border-bottom: 1px solid #aaaaaa;
  padding-top: 4px;
  padding-bottom: 4px;
}

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

table.bodyTable th, table.bodyTable td {
  font-size: 1em;
}

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

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

.source {
  border: 1px solid #999;
}
