/*
 * 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.
 */
div.formSaveBar {
	width: 100%;
	height: 22px;
	background-color: #AFCBFB;
}
 
div.formSaveButton input {
	background: url(images/forms/disk.png) no-repeat;
	float: left;
	cursor: pointer;
	width: 18px;
	height: 18px;
	border: none;
	margin-left: 2px;
	margin-top: 2px;
}

div.formNewButton input {
	background: url(images/forms/plus_icon.png) no-repeat;
	float: left;
	cursor: pointer;
	width: 18px;
	height: 18px;
	border: none;
	margin-left: 2px;
	margin-top: 2px;
}

div.formNewButton.disabled input {
	background: url(images/forms/plus_icon_disabled.png) no-repeat;
	float: left;
	cursor: default;
	width: 18px;
	height: 18px;
	border: none;
	margin-left: 2px;
	margin-top: 2px;
}

div.formRefreshButton input {
	background: url(images/forms/arrow_refresh_small.png) no-repeat;
	float: left;
	cursor: pointer;
	width: 18px;
	height: 18px;
	border: none;
	margin-left: 2px;
	margin-top: 2px;
}

div.formCancelButton input {
	background: url(images/forms/cancel_icon.png) no-repeat;
	float: left;
	cursor: pointer;
	width: 18px;
	height: 18px;
	border: none;
	margin-left: 2px;
	margin-top: 2px;
}