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

@charset "UTF-8";
.logwin {
      position: absolute;

      z-index:2147483648;
      width: 800px;
      border: 1px solid gray;
      background: white;
      text-align: left;
}

.logwin_title{
	width:auto;
	  height: 23px;
	  background:url(../images/grid_headerbg.gif) repeat-x top left;
	  border: 1px sold #737373;
}

.logwin_title_actionbox{
	width:175px;
	height:16px;
	float:left;
	margin:4px 0 0 7px;
	display:inline;
}


.logwin_title_actionbox .select {
	background: #424242; 
	font: normal 10px Arial, Helvetica, sans-serif; 
	float:left; 
	border: 1px solid #6e6e6e; 
	height: 16px; 
	width: 100px; 
	margin-left:3px; 
	padding:0 0 0 3px; 
	color:#CCC;
}

.logwin_title_rgtactionbox{
	width:49px;
	height:15px;
	float:right;
	margin:4px 0 0 7px;
	display:inline;
}


a.logwin_playbutton {
	width:18px;
	height:15px;
	float:left;
	background:url(../images/play_button.gif) no-repeat top left;
	margin-right:2px;
	padding:0;
}

a:hover.logwin_playbutton {
	background:url(../images/play_button_hover.gif) no-repeat top left;
}

a.logwin_stopbutton {
	width:18px;
	height:15px;
	float:left;
	background:url(../images/stop_button.gif) no-repeat top left;
	margin-right:2px;
	padding:0;
}

a:hover.logwin_stopbutton {
	background:url(../images/stop_button_hover.gif) no-repeat top left;
}

a.logwin_clrbutton {
	width:28px;
	height:15px;
	float:left;
	background:url(../images/clr_button.gif) no-repeat top left;
	margin:0;
	padding:0;
}

a:hover.logwin_clrbutton {
	background:url(../images/clr_button_hover.gif) no-repeat top left;
}

a.logwin_shrinkbutton {
	width:18px;
	height:15px;
	float:right;
	background:url(../images/shrink_button.gif) no-repeat top left;
	margin-right:7px;
	margin-top:4px;
	padding:0;
}

a:hover.logwin_shrinkbutton {
	background:url(../images/shrink_button_hover.gif) no-repeat top left;
}

a.logwin_minimizebutton {
	width:18px;
	height:15px;
	float:left;
	background:url(../images/minimize_button.gif) no-repeat top left;
	margin-right:2px;
	padding:0;
}

a:hover.logwin_minimizebutton {
	background:url(../images/minimize_button_hover.gif) no-repeat top left;
}

.logwin_content {
    overflow:scroll;
    height: 477px;
    background: white;
}

