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

/*@import(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css);
@import(https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap-responsive.css);*/
html {
  background-color: #fff;
}
body {
  font-size: 16px;
}
li {
  line-height: 120%;
}

div#topbar,
div#banner,
div#breadcrumbs,
div#bodyColumn,
footer {
  width: initial;
  padding-left: 20px;
  padding-right: 20px;
  clear: both;
}
footer {
  background-color: #e5e5e5;
}
footer .row, footer p, footer .pull-right {
  margin: 5px;
}
div#search-form.navbar-search.pull-right {
  width: 290px;
  margin-right: 0;
  margin-top: -5px;
  margin-left: 0;
  position: initial;
}
li#publishDate.pull-right {
  list-style: none;
}
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container,
.navbar-inner {
  width: initial;
}
/* Change the color and effect when clicking in menus */
.dropdown-menu>li>a:hover,
.dropdown-menu>li>a:focus,
.dropdown-submenu:hover>a,
.dropdown-submenu:focus>a {
  background-color: #e5e5e5;
  background-image: none;
  color: #000;
  font-weight: bolder;
}

.dropdown-backdrop {
  position: static;
}

@media only screen and (max-width: 979px) {
  body {
    padding-left: 0;
    padding-right: 0;
    width: initial;
    margin: 0;
  }
  /* Without this rule, drop-down divs are a fixed height
   * the first time they are expanded */
  .collapse.in {
      height: auto !important;
  }
  div#search-form.navbar-search.pull-right {
    padding: 0;
    margin-left: ;
    width: initial;
    clear: both;
  }
}

/* Fix Google Custom Search results on very narrow screens */
@media(max-width: 480px) {
    .gsc-overflow-hidden .nav-collapse {
        -webkit-transform: none;
    }
}

/* Override weird body padding thing that causes scrolling */
@media (max-width: 767px)
body {
    padding-right: 0;
    padding-left: 0;
}

@media (max-width: 767px)
.navbar-fixed-top, .navbar-fixed-bottom, .navbar-static-top {
  margin-left: 0;
  margin-right: 0;
}