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

/* Apache general header color R:G:B 82:93:118, #525D76 */

BODY {
font-family: Arial, Verdana, Helvetica, sans-serif;
background-color: #F9F7ED;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
margin-left: 0px;
}

A {
color: #4B107E;
}

A:hover { 
color: #000000;
text-decoration: underline;
}

UL {
margin-top: 0; 
margin-bottom: 0;
}

DIV.endcolumns {
  clear: both;
  font-size: 1px;
}  

.main-logo { 
  height: 30px;
  border: 0;
}

DIV.centerarea {
margin-left: 2px;
margin-right: 2px;
margin-top: 2px;
}

DIV.contentarea {
margin-top: 10px;
padding: 10px;
}

#footer {
font-size: 10px;
font-family: Arial, Verdana, Helvetica, sans-serif;
color: #2D4362;
}

.headerboxoutside {
padding: 0;
width: 100%;
}

.headerboxtop {
padding-top: 10px;
}

.headerboxtop .left {
float: left;
width: 300px;
padding-left: 10px;
}

.headerboxtop .left a img {
margin: 0;
padding: 4px;
background-color: #FFFFFF;
border: #999999 solid 1px;
}

.headerboxtop .right {
float: right;
width: 500px;
text-align: right;
padding-top: 10px;
padding-right: 12px;
}

.headerboxbottom {
padding: 0;
}

/* ===== link-column Styles ===== */
#link-column {
float: right;
width: 210px;
/*background: white;*/
/*background: #E2E7EC;*/
/*border: #999999 dotted 1px; padding-bottom: 8px;*/
}

#link-column h2 {
margin: 0px 0px 0px 0px;
padding: 6px 4px 6px 4px; 
/*background: #CDDADC;*/
color: black;
font-family: Arial, Verdana, Helvetica, sans-serif;
font-size: 14px;
font-weight: bold;
}
#link-column h3 {
margin: 0px 0px 0px 0px;
padding: 1px 4px 1px 6px;
font-family: Arial, Verdana, Helvetica, sans-serif;
font-size: 11px;
font-weight: bold;
color: #4B107E;
}
#link-column h3 a {
color: #4B107E;
margin: 0px;
padding: 0px;
display: inline;
text-decoration: underline;
}
#link-column h3 a:hover {
color: #2D4362;
text-decoration: underline;
background: transparent;
border: #000000 none 0px;
}
#link-column a {
margin: 0px 0px 0px 0px;
padding: 1px 4px 1px 10px;
display: block;
font-family: Arial, Verdana, Helvetica, sans-serif;
font-size: 11px;
font-weight: bold;
color: #C9123F;
text-decoration: none;
}
#link-column a:hover {
background: #CDDADC;
color: #000000;
}
#link-column a.sub-link {
padding: 0px 2px 0px 2px;
display: inline;
text-decoration: underline;
}

#link-column p {
margin: 0px 0px 0px 0px;
padding: 1px 4px 1px 10px;
display: block;
font-family: Arial, Verdana, Helvetica, sans-serif;
font-size: 11px;
font-weight: bold;
background: #CDDADC;
color: #934000;
text-decoration: none;
}

/* ===== detail-column Styles ===== */
#detail-column {
margin-right: 222px;
}
#detail-column h2 {
margin: 0px 0px 0px 0px;
font-size: 12pt;
font-family: Arial, Verdana, Helvetica, sans-serif;
font-weight: bold;
/*background: #525D76;*/
color: #000000;
padding: 2px 0px 2px 4px;
}
#detail-column h2 a {
display: inline;
color: #2D4362;
text-decoration: none;
}
#detail-column h2 a:hover {
display: inline;
color: #934000;
text-decoration: underline;
}

#detail-column h3 {
margin: 0px 0px 2px 0px;
font-size: 9pt;
font-family: Arial, Verdana, Helvetica, sans-serif;
font-weight: bold;
color: #934000;
}
#detail-column h3 a {
display: inline;
color: #2D4362;
text-decoration: none;
}
#detail-column h3 a:hover {
display: inline;
color: #934000;
text-decoration: underline;
}

#detail-column p {
margin: 6px 0px 6px 0px;
font-size: 9pt;
font-family: Arial, Verdana, Helvetica, sans-serif;
}
#detail-column p a {
padding-left: 2px;
padding-right: 2px;
display: inline;
color: #4B107E;
text-decoration: none;
font-weight: bold;
}
#detail-column p a:hover {
color: #000000;
text-decoration: underline;
background: transparent;
}
#detail-column p a.sub-link {
font-weight: normal;
}

#detail-column ul {
margin: 2px 0;
padding-left: 20px;
}
#detail-column ul li {
font-size: 9pt;
font-family: Arial, Verdana, Helvetica, sans-serif;
}


#special, #intro, #users, #announcements, #inthenews, #testimonials, #projects-standards {
margin: 0px 0px 10px 0px;
padding: 5px;
border: #999999 dotted 1px;
/*background: #E2E7EC;*/
}
