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

.blogs {
position: inherit;
width: inherit;
font-size: 100%;
text-decoration: none;
font-family: Verdana, Arial, Helvetica, sans-serif;
}

.treeHeader, .treeHeaderCurrent {
color: black;
font-weight: bold;
text-decoration: none;
}

.treeHeaderCurrent {
color: black;
font-weight: bold;
}

.treeHeaderOutline {
color: black;
font-weight: normal;
}

.treeHeaderPage {
color: blue;
font-weight: bold;
text-decoration: none;
}

.treeHeaderSubPage {
color: blue;
font-weight: normal;
text-decoration: none;
text-align: right;
width: 100%;
}

.tocItem {
color: blue;
text-decoration: none;
}

.tocItemCurrent {
color: black;
font-weight: bold;
}

.editwrapper {
color: black;
background: #ffffff;
text-decoration: none;
margin-left: 12px;
margin-top: 2px;
border-top: 1px solid black;
border-left: 1px solid black;
}

.contentwrapper {
color: black;
background: #ffffff;
text-decoration: none;
margin-left: 12px;
margin-top: 2px;
}

.floatleft {
display: inline;
position: relative;
vertical-align: text-top;
/*float: left;*/
}

.topcentered {
display: block;
text-align: center;
}

/*
.rightjustify {
float: right;
padding-left: 5px;
display: inline;
vertical-align: top;
text-align: right;
width: 100%;
height: 100%;
}
*/
.rightjustify {
display: inline;
vertical-align: text-top;
float: right;
}

.leftjustify {
display: inline;
vertical-align: text-top;
float: left;
}

.blogheader {
color: black;
font-weight: bold;
text-align: left;
margin-top: 10px;
margin-left: 10px;
}

.blogtext {
color: #222222;
font-weight: normal;
text-align: left;
margin-left: 20px;
font-size: 1.0em;
}

.blogtext:hover {
background: #fffeee;
}

.blogtitle, A.blogtitle {
color: white;
font-weight: bold;
text-align: left;
text-decoration: none;
display: inline;
}

A.blogtitle:hover {
text-decoration: underline;
}

.blogtitleboxed {
font-size: 1.1em;
color: black;
background: #D4D0C8;
text-decoration: none;
border: 1px solid black;
padding: 4px;
display: inline;
}

.bloghr {
border: 0.1em solid #999999;
color: white;
background: #1C334D;
padding: 4px;
height: 13px;
}

.blogwrapper {
background: #eeeeee;
padding: 4px;
margin-top: 6px;
font-weight: normal;
text-align: left;
}

.blogwrapper:hover {
background: #fffeee;
}

.blogcontentwrapper {
background: #f8f8f8;
font-size: 1.1em;
border: 1px solid #000000;
padding: 15px 5px 15px 5px;
margin-top: 6px;
margin-bottom: 16px;
color: black;
font-weight: normal;
text-align: left;
}

.blogcontentwrapper:hover {
background: #fffeee;
}

.responseheader, A.responseheader {
color: #000099;
font-size: 0.9em;
font-weight: bold;
text-align: left;
text-decoration: none;
margin-left: 10px;
}

A.responseheader:hover {
color: #ff0000;
text-decoration: underline;
}

.responsetext {
color: #222222;
font-size: 0.75em;
font-weight: normal;
text-align: left;
margin-left: 20px;
}

.responseTreeWrapper:hover {
background: #fffeee;
}

.responseTreeWrapper {
color: black;
background: #ffffff;
font-weight: normal;
text-align: left;
text-decoration: none;
margin-left: 12px;
margin-top: 2px;
border-top: 1px solid black;
border-left: 1px solid black;
}

.responseSelected {
background: #BBBBBB;
border: 1px dashed black;
}

