/*
 * 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:#345;
    margin:0px;
    padding:0px;
    font-family: arial, verdana, sans-serif;
}

#splash {
    position:absolute;
    left:50%;
    top:50%;
    margin:-180px 0 0 -370px;
    height:260px;    
    width:730px;
    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;
    color:#c0c0c0;
    text-decoration:none;
}  
#splash_nav a:hover {
    text-decoration:underline;
    color:#fff;
}


.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%;
  background-color:#364656;
}
#footer a {
  color:#aaa;
}

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

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


