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

.eXtremeTable {
}

.eXtremeTable select {
	font-family: verdana, arial, helvetica, sans-serif;
	font-size: 9px;
	border: solid 1px #EEE;
	width: 75px;
}

.eXtremeTable .tableRegion {
	border: none;
}

.eXtremeTable .filter {
	background-color: #efefef;
}

.eXtremeTable .filter input {
	font-family: verdana, arial, helvetica, sans-serif;
	font-size: 10px;
	width: 100%;
}

.eXtremeTable .filter select {
	font-family: verdana, arial, helvetica, sans-serif;
	font-size: 9px;
	border: solid 1px #EEE;
	width: 100%;
}

.eXtremeTable .tableHeader {
	font-weight: bold;
	text-align: left;
	vertical-align: top;
	background-color: #bbb;
	color:white
}

.eXtremeTable .tableHeaderSort {
	font-weight: bold;
	text-align: left;
	vertical-align: top;
	background-color: #aaa;
	color: white;
}

.eXtremeTable .odd a, .even a {
}

.eXtremeTable .odd td, .eXtremeTable .even td {
}

.eXtremeTable .odd {
	background: #efefef;
}

.eXtremeTable .even {
	background: #ddd;
}


.eXtremeTable .calcRow {
  text-align: right;
  font-weight: bold;
  background-color: #bbb;
  color: white;
  border-color: black;
}

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

.eXtremeTable .calcResult {
	text-align: right;
	background-color: #aaa;
	color: white;
}

.eXtremeTable .calcHeaderSucces {
  background-image: url(../images/icon_success_sml.gif); 
  background-repeat: no-repeat; 
  background-position: center;
  background-color: #bbb;
}

.eXtremeTable .calcHeaderFailure {
  background-image: url(../images/icon_warning_sml.gif); 
  background-repeat: no-repeat; 
  background-position: center;
  background-color: #bbb;
}

.eXtremeTable .calcHeaderError {
  background-image: url(../images/icon_error_sml.gif); 
  background-repeat: no-repeat; 
  background-position: center;
  background-color: #bbb;
}

.eXtremeTable .highlight td {
	background-color: #bbb;
}

.eXtremeTable .highlight a, .highlight a {
}

.eXtremeTable .toolbar {
	background-color: #fff;
/*
	font-family: verdana, arial, helvetica, sans-serif;
	font-size: 9px;
	margin-right: 1px;
	border-right: 1px solid silver;
	border-left: 1px solid silver;
	border-top: 1px solid silver;
	border-bottom: 1px solid silver;
*/
}

.eXtremeTable .toolbar td {
	color: #fff;
/*
	padding: 0px 3px 0px 3px;
	text-align:center;
*/
}

.eXtremeTable .separator {
	width: 7px;
}

.eXtremeTable .statusBar {
	background-color: #F4F4F4;
	font-family: verdana, arial, helvetica, sans-serif;
	font-size: 10px;
}

.eXtremeTable .filterButtons {
	background-color: #efefef;
	text-align: right;
}

.eXtremeTable .title {
	color: #444444;
	font-weight: bold;
	font-family: verdana, arial, helvetica, sans-serif;
	font-size: 15px;
	vertical-align: middle;
}

.eXtremeTable .title span {
	margin-left: 7px;
}

.eXtremeTable .formButtons {
	display: block;
	margin-top: 10px;
	margin-left: 5px;
}

.eXtremeTable .formButton {
	cursor: pointer;
	font-family: verdana, arial, helvetica, sans-serif;
	font-size:10px;
	font-weight: bold;
	background-color: #308dbb;
	color: white;
	margin-top: 5px;
	border: outset 1px #333;
	vertical-align: middle;
}

.eXtremeTable .tableTotal {
	background-color: #FFFFFF;
	border-top: solid 1px Silver;	
}

.eXtremeTable .tableTotalEmpty {
	background-color: #FFFFFF;	
}

