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