/*
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: 125;
    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;
}
