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