/*
 * 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.
 */
div.timeframe_calendar {
  display: inline-block;
  margin: 0;
  padding: 0;
  text-align: center;
  text-shadow: none;
}

/* Menu */
div.timeframe_calendar ul.timeframe_menu {
  list-style-type: none;
  font-weight: bold;
  margin: auto;
  padding: 0 0 6px;
  width: 60px;
}
  div.timeframe_calendar ul.timeframe_menu li {
    display: inline;
  }
    div.timeframe_calendar ul.timeframe_menu li a {
      display: inline-block;
      height: 20px;
      padding: 2px 0 0;
      text-decoration: none;
      width: 20px;
      -webkit-box-shadow: 0 1px 2px #999;
    }
      div.timeframe_calendar ul.timeframe_menu li a.previous, div.timeframe_calendar ul.timeframe_menu li a.next {
        background: #fff;
        color: #468966;
      }
        div.timeframe_calendar ul.timeframe_menu li a.previous:hover, div.timeframe_calendar ul.timeframe_menu li a.next:hover {
          background: #ccc;
        }
        div.timeframe_calendar ul.timeframe_menu li a.previous:active, div.timeframe_calendar ul.timeframe_menu li a.next:active {
          background: #aaa;
        }
      div.timeframe_calendar ul.timeframe_menu li a.disabled, div.timeframe_calendar ul.timeframe_menu li a.disabled:hover, div.timeframe_calendar ul.timeframe_menu li a.disabled:active {
        background: #fff;
        color: #ccc;
        cursor: default;
      }
      div.timeframe_calendar ul.timeframe_menu li a.today {
        background: #88CEFF;
        color: #000;
      }
        div.timeframe_calendar ul.timeframe_menu li a.today:hover {
          background: #785088;
        }
        div.timeframe_calendar ul.timeframe_menu li a.today:active {
          background: #785088;
        }
      div.timeframe_calendar ul.timeframe_menu li a.previous {
        -webkit-border-top-left-radius:     10px;
        -webkit-border-bottom-left-radius:  10px;
        -moz-border-radius-topleft:         11px;
        -moz-border-radius-bottomleft:      11px;
      }
      div.timeframe_calendar ul.timeframe_menu li a.next {
        -webkit-border-top-right-radius:     10px;
        -webkit-border-bottom-right-radius:  10px;
        -moz-border-radius-topright:         11px;
        -moz-border-radius-bottomright:      11px;
      }

/* Calendar*/
div.timeframe_calendar table {
  border-collapse: collapse;
  display: inline;
  display: inline-block;
  font-size: 15px;
  margin: 0 6px 12px;
}
  /* Month names */
  div.timeframe_calendar table caption {
    text-shadow: 0 0 0 #fff;
  }
  /* Cell sizes */
  div.timeframe_calendar thead th, div.timeframe_calendar tbody td {
    text-align: center;
    height: 18px;
    margin: 0;
    padding: 2px 1px;
    width: 20px;
  }
  /* Weekday letters */
  div.timeframe_calendar thead {
    background: #886898;
    color: #eee;
  }
  /* Days */
  div.timeframe_calendar tbody {
    background: #fff;
    -webkit-box-shadow: 0px 2px 6px #999;
  }
    div.timeframe_calendar tbody td {
      cursor: pointer;
    }
      /* Hover states not available in IE */
      div.timeframe_calendar tbody td.selectable:hover {
        background-color: #bbb;
      }
      div.timeframe_calendar tbody td.selected:hover, div.timeframe_calendar tbody td.stuck:hover {
        background-color: #e1d8e5;
      }
      /* Selected states */
      div.timeframe_calendar tbody td.selected {
        background-color: #9980a8;
      }
      div.timeframe_calendar tbody td.stuck {
        background-color: #e1d8e5;
      }
      /* Range markers */
      div.timeframe_calendar tbody td.startrange, div.timeframe_calendar tbody td.endrange, div.timeframe_calendar tbody td.startendrange {
        cursor: col-resize;
      }
      div.timeframe_calendar tbody td.startrange {
        background-image: url(../images/start.png);
      }
      div.timeframe_calendar tbody td.endrange {
        background-image: url(../images/end.png);
      }
      div.timeframe_calendar tbody td.startendrange {
        background-image: url(../images/startend.png);
      }
      /* Today */
      div.timeframe_calendar tbody td.today {
        background-color: #88CEFF;
        color: #000;
      }
        div.timeframe_calendar tbody td.today_selected {
          background-color: #785088;
        }
        div.timeframe_calendar tbody td.today_stuck {
          background-color: #785088;
        }
      /* Post/pre-month */
      div.timeframe_calendar tbody td.beyond {
        background-color: #aaa;
        background-image: none;
        color: #ccc;
      }
        div.timeframe_calendar tbody td.beyond_selected {
          background-color: #999;
        }
        div.timeframe_calendar tbody td.beyond_stuck {
          background-color: #888;
        }
      
      div.timeframe_calendar tbody td.unselectable {
        color: #ccc;
        cursor: default;
      }
      /* Clear button */
      div.timeframe_calendar tbody td span.clear {
        color: transparent;
        display: block;
        height: 0;
        position: absolute;
        width: 0;
      }
        div.timeframe_calendar tbody td span.clear span {
          background-image: url(../images/closebox.png);
          cursor: pointer;
          display: block;
          height: 30px;
          left: -18px;
          position: relative;
          text-indent: -10000px;
          top: -18px;
          width: 30px;
        }
          div.timeframe_calendar tbody td span.clear span.active {
            background-image: url(../images/closebox_selected.png);
          }
