/**
* 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.
*/
.node circle {
 	fill-opacity: 1.0;
 	shape-rendering: crispEdges;
}

.node text {
 	pointer-events: none;
 	text-shadow: 0 1px 0 #fff;
}

.link {
 	fill: none;
 	stroke-opacity: .7;
}

.link:hover {
 	stroke-opacity: 1.0;
}

.legend rect {
  fill:white;
  stroke:black;
  opacity:0.8;
}

.bshadow {
	-moz-box-shadow: 3px 3px 5px #535353;
	-webkit-box-shadow: 3px 3px 5px #535353;
	box-shadow: 3px 3px 5px #535353;
	-moz-border-radius: 6px 6px 6px 6px;
	-webkit-border-radius: 6px;
	border-radius: 6px 6px 6px 6px;
	font-size: 0.85em;
}

div#loading {
	margin-top: 200px;
	margin-left: 200px;
}

div.tooltip {
	position: absolute;
	z-index: 10;
	background-color: white;
	-moz-box-shadow: 3px 3px 5px #535353;
	-webkit-box-shadow: 3px 3px 5px #535353;
	box-shadow: 3px 3px 5px #535353;
	-moz-border-radius: 6px 6px 6px 6px;
	-webkit-border-radius: 6px;
	border-radius: 6px 6px 6px 6px;
	font-size: 0.85em;
}

.tooltipDiv {
	width: 140px;
}

.valueCol {
	float:left;
	margin-left: 90px;
	width: 325px;
	margin-top: -85px;
}

.topControls {
	margin-top:15px;
	float: left;
}

.metricsControls {
	margin-top: 25px;
	float:left;
	height: 20px;
}

label.flowGraphLabel {
	font-size: 1.2em;
	margin-top: 10px;
	margin-left: 200px;
}

label.jobsLabel {
	margin-right: 5px;
}

#jobs {
	margin-right: 5px;
}

img#stateImg {
	margin-top:	10px;
	margin-right: 20px;
}

#layers {
	margin-right: 20px;
}

label.layersLabel {
	margin-right: 5px;
}

label.tagsLabel {
	margin-right: 35px;
	margin-top: 10px;
}

label.refreshLabel {
	margin-right: 5px;
}

#refreshInterval {
	margin-right: 5px;
}

#toggleTimer, #tagDialogBtn, #pauseTableRefresh {
	margin-right: 15px;
	height: 25px;
	font-size: 0.7em;
}

.no-close-dialog .ui-dialog-titlebar-close {
	display: none;
}

.ui-dialog .ui-dialog-titlebar {
	font-size: 0.8em;
}

.ui-dialog .ui-dialog-buttonpane {
	font-size: 0.8em;
}

.ui-widget-overlay {
	opacity: 0.2;
	background-color: steelblue;
	background-image: none;
}

#metrics {
	margin-right: 5px;
}

#rateUnit {
	margin-right: 15px;
}

label.metricsLabel {
     margin-right: 5px;
}

label.chartTypeLabel {
	margin-right: 5px;
}


#showAll {
 	font-size: 1.05em;
 	color: steelblue;
}

#showAll:hover {
	cursor: default;
}

label.metricsTitle {
	font-size: 1.18em;
	margin-top: 10px;
	margin-left: 450px;
}

.warningLabel {
	 font-size: 0.95em;
	 margin-left: 10px;
}

th.smaller {
	padding: 3px;
	font-weight: normal;
	font-size: 0.95em;
}

th {
	padding: 8px;
	font-weight: bold;
	text-align: center;
	border: 1px solid lightsteelblue;
}

td.left {
	padding: 8px;
	text-align: left;
}

td.right {
	padding: 8px;
	text-align: right;
}

td.smallLeft, td.smallCenter, td.smallRight {
	padding: 3px;
	font-size: 0.85em;
	white-space: nowrap;
}

td.smallLeft {
    text-align: left;
}

td.smallCenter {
	text-align: center;
}

td.smallRight {
	text-align: right;
}

td.center {
	padding: 8px;
	text-align: center;
	width: 150px;
	word-wrap:break-word;
}

td.center100 {
	padding: 8px;
	text-align: center;
}

caption {
	font-weight: bold;
}

.hidden {
	position:absolute;
	left:-10000px;
	top:auto;
	width:1px;
	height:1px;
	overflow:hidden;
}