/*
 * 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.
 */
/*
 bg             #334455
 borders-top    #2e3e4e
 border-left    #304050
*/

body {
    background-color:#FFF;
    margin:0px;
    padding:0px;
    font-family: verdana, arial,  sans-serif;
}

#splash {
    position:absolute;
    left:50%;
    top:50%;
    margin:-180px 0 0 -370px;
    height:260px;    
    width:800px;
    z-index:0;
}
#splash_branding {
    padding:5px;
    width:315px;
    height:200px;
    padding:32px 50px 30px 0;
    text-align:right;
    float:left;
}
#splash_nav {
    float:left;
    height:200px;
    width:315px;
    padding: 30px 0 30px 45px;
    border-left:solid 1px #304050;
}
#splash_nav a {
    display:block;
    padding:10px;
    text-decoration: none;
    color:#193678;
    font-weight: bolder;
}  
#splash_nav a:hover {
    color:#4965A6;
    text-decoration: none;
}


.border {
    border-top: solid 1px #234;
}



#footer{
  position:absolute;
  bottom:20px;
  width:100%;
  padding:10px 0px;
  border-spacing:0px;
  border-top:solid 1px #2e3e4e;
  color:#234;
  font-size:90%;
}
#footer a {
  color:#193678;
}

#footer p {
  width:100%;
  padding:5px 15px;
  text-align:center;
}

#powered {
  margin-left:-30px;
}


