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