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

body {
	margin:0 0;
	text-align: center;
}
	
#main_panel {
	clear:both;
	margin: 0 auto;
	text-align: left;
}

.canvas_tile {
	cursor:crosshair;
}

#toolbar {
	font:normal 12px 'Trebuchet MS','Arial'; 
	margin:0 auto; 
	text-align: left;
	padding:0 0; 
	height:32px;
	background-image:url(/resource/images/back.gif); 
	background-repeat:repeat-x; 
}

#toolbar ul { 
	margin:0 0; 
	padding:0 10px 0 10px; 
	float:left;
	display:block;
	line-height:32px;
	list-style:none; 
}

#toolbar li {
	float:left; 
	display:inline; 
	padding:0;
	height:32px;
}

#toolbar a { 
	color:white; 
	float:left;
	display:block;
	padding:0 3px 0 3px; 
	text-decoration:none;
	line-height:32px;
}

#toolbar a span { 
	display:block; 
	float:none; 
	padding:0 10px 0 7px; 
} 

#toolbar a span img { 
	border:none; 
	margin:8px 4px 0 0; 
} 

#toolbar a:hover { 
	background: url(/resource/images/left.png) no-repeat left center; 
} 

#toolbar a:hover span { 
	background:url(/resource/images/right.png) no-repeat right center; 
}


#toolbar ul li ul {
    position: absolute;
    top:32;
    width: 260;
    height: 95;
    display: block;
    display: none;
    border-top: 1px solid black;
    background-image:url(/resource/images/back.gif);
    background-repeat:repeat-x repeat-y;
}

#toolbar ul li ul li {
    display: list-item;
    float:none;
    padding-left: 20;
}

#toolbar ul li ul li.current {
    background: url(/resource/images/cad.gif) no-repeat left center; 
}

#toolbar ul li ul li a {
    display:block;
    padding:0 3px 0 3px; 
    text-decoration:none;
    line-height:32px;
    vertical-align: bottom;    /* this is to fix the list gap in IE */
}

#toolbar ul li ul li a:hover {
    background: url(/resource/images/left.png) no-repeat left center; 
}

#toolbar ul li ul li a:hover span {
    background: url(/resource/images/right2.png) no-repeat right center; 
}

span.dark {
	margin-right:20px;
	float:right;
	display:block;
	width:32px;
	height:30px;
	background:url(/resource/images/gray-green.png) no-repeat center center; 
}

span.bright {
	margin-right:20px;
	float:right;
	display:block;
	width:32px;
	height:30px;
	background:url(/resource/images/bright-green.png) no-repeat center center; 
}
