/*
 * 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.
 */
.menubar {
background-repeat: repeat-x;
background-image: url('images/titlebar.png');
}

#menu {
color: #000;
font: bold 11px/16px arial, helvetica, sans-serif;
width: 100%;
float: left;
background-repeat: repeat-x;
background-image: url('images/titlebar.png');
}

#menu ul {
list-style: none;
margin: 0;
padding: 0;
float: left;
}

#menu a, #menu span, #menu h2 {
}

#menu h2 {
color: #000;
background: #000;
text-transform: uppercase;
}

#menu a {
color: #000;
text-decoration: none;
display: block;
border-width: 0px;
margin: 0;
padding: 2px 3px;
}

#menu a:hover {
color: #fff;
background: #3875D7;
}

#menu ul:hover {
color: #fff;
background: #3875D7;
}

#menu li {position: relative;}

#menu ul ul {
position: absolute;
width: 12em;
z-index: 500;
}

#menu ul ul ul {
position: absolute;
top: 0;
left: 100%;
}

div#menu ul ul,
div#menu ul li:hover ul ul,
div#menu ul ul li:hover ul ul
{display: none;}

div#menu ul li:hover ul,
div#menu ul ul li:hover ul,
div#menu ul ul ul li:hover ul
{display: block;}

div#menu ul ul table {
width:100%;
color: #000;
font: bold 11px/16px arial, helvetica, sans-serif;
background-color: #eeeeee;
}

div#menu ul ul td:hover {
width:100%;
color: #fff;
background-color: #3875D7;
cursor:pointer;
}
