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

/*
 * The admin.css is currently a collection of a lot of CSS styles, which should
 * be cleaned up for more appropriate and targeted stylings.
 *
 * This stylesheet is loaded by the AbstractWebConsolePlugin before the
 * stylesheet addressed by the BrandingPlugin.getMainStyleSheet() method, which
 * is the webconsole.css by default.
 *
 * See also http://felix.apache.org/site/branding-the-web-console.html
 */

/*******************************************************************************
 * The content and container classes were previously used to uniformly render
 * tables (before the tablelayout class has been added below).
 * For backwards compatibility we keep these classes for now to enable
 * existing plugins to still render somewhat nice.
 */
table.content {
    clear: both;
    font-size: 10px;
    line-height: 13px;
    border: 1px solid #AAAAAA;
    padding: 0px;
    margin: 0px;
    margin-top: 26px;
    margin-bottom: 26px;
    text-align: left;
}

tr.content {
}

td.content {
    color: #333333;
    border-bottom: 1px solid #cccccc;
    vertical-align: middle;
    padding: 5px;
}

td.aligntop {
    vertical-align: top;
}

td.content img {
    width: 10px;
    height: 10px;
}

td.disabled {
    color: #999999;
}

th.content {
    color: #333333;
    border-bottom: 1px solid #cccccc;
    text-align: left;
    padding: 5px;
    padding-left: 10px;
    font-weight: bold;
}

.right {
    text-align: right;
}
.center {
    text-align: center;
}

th.container {
    color: #6181A9;
    background-color: #f0f0f0;
}

th.important {
    color: #B81833;
}

.important {
    color: #B81833;
}

.clearleft {
    clear: left;
}

.clearboth {
    clear: both;
}
/******************************************************************************/


/*******************************************************************************
 * The tablelayout class hass been used recently to render tables in a uniform
 * way. Some existing plugins might still use the tablelayout class.
 */
table.tablelayout {
    border-left: 1px solid #6181A9;
    border-right: 1px solid #6181A9;
    border-collapse: collapse;
    font-family:arial;
    background-color: #CDCDCD;
    font-size: 8pt;
    width: 100%;
    text-align: left;
}
table.tablelayout tbody tr {
}

table.tablelayout thead tr th, table.tablelayout tfoot tr th {
    background-color: #e6EEEE;
    border: 1px solid #6181A9;
    font-size: 8pt;
    padding: 4px;
}
table.tablelayout thead tr .header {
    background-image: url(../imgs/bg.gif);
    background-repeat: no-repeat;
    background-position: center right;
    cursor: pointer;
}
table.tablelayout tbody td {
    color: #3D3D3D;
    border-top: 1px solid #6181A9;
    border-bottom: 1px solid #6181A9;
    padding: 4px;
    background-color: #FFF;
    vertical-align: top;
}
table.tablelayout tbody tr.odd td {
    background-color:#F0F0F6;
}
table.tablelayout thead tr .headerSortUp {
    background-image: url(../imgs/asc.gif);
}
table.tablelayout thead tr .headerSortDown {
    background-image: url(../imgs/desc.gif);
}
table.tablelayout thead tr .headerSortDown, table.tablelayout thead tr .headerSortUp {
background-color: #8dbdd8;
}
/******************************************************************************/


/*******************************************************************************
 * The statusline class was the predecessor to the current status line setup
 * using the JQuery UI statline and ui-state-highlight classes.
 * This backwards compatible statusline class is configured as a copy of the
 * basic theme statline/ui-state-highlight classes.
 */
div.statline {
    margin-bottom:0.5em !important;
    margin-top:0.5em !important;
    padding:0.2em;
    background:#FBF9EE url(images/ui-bg_glass_55_fbf9ee_1x400.png) repeat-x scroll 50% 50%;
    border:1px solid #FCEFA1;
    color:#363636;
}
/******************************************************************************/
