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

/* This CSS file is used to reverse the style direction for rtl languages. */
/* It is intended to be cascaded with maincss.css. */

/* ===== Resets/Browser Normalization ===== */

body, caption, th {
    text-align: right;
}

/* ===== Legacy Styles ===== */

.boxlink {
    float: left;
}

DIV.boxhead-left {
    float: right;
}

DIV.boxhead-right {
    float: left;
}

.submenutextinfo {
    border-right: none;
    border-left: 0.1em solid #5886C6;
}

.submenutext, A.submenutext, A.submenutext:visited,
.submenutextdisabled, A.submenutextdisabled {
    border-right: none;
    border-left: 0.1em solid #5886C6;
    padding-left: 0.5em;
    padding-right: 0.2em;
}

.submenutextinforight, .submenutextright, A.submenutextright,
.submenutextrightdisabled, A.submenutextrightdisabled {
    padding-left: none;
    padding-right: 0.2em;
}

/* ===== Product Summary Styles ===== */
.product-prevnext {
    text-align: left;
}

.productsummary .smallimage {
    float: right;
    margin: 0 0 0.5em 0.5em;
}

.productsummary .productbuy {
    float: left;
    text-align: left;
}

.productsummary .productinfo {
    text-align: right;
}

.treeWrapper {
    border-left: none;
    border-right: 0.1em solid #000000;
    margin-left: 0;
    margin-right: 1.2em;
    text-align: right;
}

.lefthalf {
    float: right;
    left: auto;
    right: 0;
    margin: 0 0 1% 1%;
}

.righthalf {
    float: left;
    margin: 0 1% 1% 0;
    right: auto;
    left: 0;
}

.leftclear {
    clear: right;
}

/* ==== Styles Copied From tabstyles.css === */

.treewrapper {
    margin-left: 0;
    margin-right: 1em;
}

DIV.col {
    float: right;
}

DIV.col-right {
    float: left;
}

DIV.simple-right-small, DIV.simple-right-half {
    float: left;
    text-align: left;
}

#column-container .left {
    float: right;
    margin-right: 0;
    margin-left: 1em;
}

.left-border {
    float: right;
    margin-right: 0;
    margin-left: 1em;
    border-right: none;
    border-left: 0.5px dotted #ccc;
}

#column-container .right {
    float: left;
    margin-left: 0;
    margin-right: 1em;
}

#column-container .leftonly {
    margin-left: 0;
    margin-right: 23em;
}

#column-container .rightonly {
    margin-right: 0;
    margin-left: 23em;
}

DIV.column-left-wide {
    float: right;
}

/* ===== New Styles ===== */

.label {
    padding-right: 0;
    padding-left: 1.1em;
    text-align: left;
}

/* ================================== */
/* ===== Used to align elements ===== */
/* ================================== */

.align-float {
    float: left;
}

.align-text {
    text-align: left;
}

/* ==================================== */
/* ===== Masthead (Header) Styles ===== */
/* ==================================== */

#masthead ul li {
    float: right;
}

#masthead ul .opposed,
#masthead ul .control-area {
    float: left;
    text-align: left;
}

/* ---------------------- */
/*      Footer Style      */
/* ---------------------- */

#footer {
    padding: 0.5em 0.5em 0.5em 0;
}

#footer ul {
    float: right;
}

#footer ul li {
    float: right;
}

#footer ul .first {
    border-right: none;
    border-left: 0.1em solid #444;
}

#footer ul .last {
    border-left: none;
    border-right: 0.1em solid #222;
}

#footer p {
    clear: right;
}

/* ================================================== */
/* ===== Main Navigation (App Menu) Styles ========== */
/* ================================================== */

#main-navigation ul li {
    float: right;
    padding: 0 0.5em 0 1em;
}

#main-navigation ul .first {
    border-right: none;
    border-left: 0.1em solid #5c809c;
}

#main-navigation ul .last {
    border-left: none;
    border-right: 0.1em solid #3e5a71;
}

/* ========================================================= */
/* ===== Component Navigation (App Header) Styles ========== */
/* ========================================================= */

#app-navigation ul li ul li {
    float: right;
    margin: 0.1em 0 0.1em 0.3em;
}

/* ================================================= */
/* ===== Screenlet Title Bar/Navigation Styles ===== */
/* ================================================= */

.screenlet-title-bar ul li {
    border-left: none;
    border-right: 0.1em solid #dedede;
    float: left;
}

.screenlet-title-bar ul .h1,
.screenlet-title-bar ul .h2,
.screenlet-title-bar ul .h3 {
    border-right: none;
    float: right;
}

/* login screenlet decorator */
.login-screenlet {
    margin-left: 0;
    margin-right: 38%;
}

/* ======================================================= */
/* ===== Basic Navigation (Vertical Menu) Style ========== */
/* ======================================================= */

.basic-nav {
    padding-left: 0;
    padding-right: 1em;
}

/* ======================================== */
/* ===== Button Bar Navigation Styles ===== */
/* ======================================== */

.button-bar ul li {
    float: right;
}

.button-bar ul .opposed {
    float: left;
}

/* ===== Button bar decorators ===== */

.tab-bar ul li ul li {
    margin-right: 0;
    margin-left: 0.5em;
}

/* ======================== */
/* ===== Table Styles ===== */
/* ======================== */

.basic-table tr .label,
.basic-table tr .group-label {
    /* field labels for forms */
    text-align: left;
    padding-right: 0;
    padding-left: 1.5em;
}

.basic-table tr .group-label {
    padding: 2em 0 0 1.5em;
}

.basic-table tr th,
.basic-table .header-row {
    text-align: right;
}

.basic-table tr .button-col a {
    float: right;
}

/* ======================= */
/* ===== Tree Styles ===== */
/* ======================= */

.basic-tree ul, .basic-tree li {
    padding-left: 0;
    padding-right: 1em;
}

.basic-tree li .expanded {
    background: url(/images/collapse.gif) no-repeat right center;
    padding-right: 0;
    padding-left: 1em;
}

.basic-tree li .collapsed {
    background: url(/images/expand.gif) no-repeat right center;
    padding-right: 0;
    padding-left: 1em;
}

/* ======================== */
/* ===== Form Styles ===== */
/* ======================== */

.basic-form table tr .label,
.basic-form table tr .group-label {
    text-align: left;
    padding-right: 0;
    padding-left: 1.5em;
}

.basic-form table tr .group-label {
    /* "header" for field label groups */
    font-size: 1.2em;
    padding: 2em 0 0 1.5em;
}

.basic-form table tr th,
.basic-form table .header-row {
    text-align: right;
}

/* ------------------------------- */
/*      List Navigation Style      */
/* ------------------------------- */

.nav-pager ul li {
    float: right;
}

.nav-pager ul .nav-displaying {
    border-left: none;
    border-right: solid #222 0.1em;
}

/* From http://jqueryui.com/demos/autocomplete/maxheight.html */
/* When displaying a long list of options, you can simply set the max-height for the autocomplete menu to prevent the menu from growing too large */
.ui-autocomplete {
    max-height: 250px;
    overflow-y: auto;
    /* prevent horizontal scrollbar */
    overflow-x: hidden;
    /* add padding to account for vertical scrollbar */
    padding-right: 20px;
}

/* IE 6 doesn't support max-height
 * we use height instead, but this forces the menu to always be this tall
 */
* html .ui-autocomplete {
    height: 250px;
}
