/*
 * 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.
 */
#header {
	padding-left: initial !important;
	padding-right: 150px;
	background-position: right center;
}
#topLinks {
	right: initial !important;
	left: 10px;
}

#topLinks span {
	border-right: none !important;
	border-left: 1px solid black;
}

#topLinks span:last-child {
	border-left: none;
}
#busy_indicator {
	float: left !important;
}
#chatPanel {
	right: initial !important;
	left: 10px;
}
.ui-tabs .ui-tabs-nav li {
	float: right !important;
}
.info-text {
	background-position: right top !important;
	padding-left: initial !important;
	padding-right: 20px;
}
.start_step1, .start_step2, .start_step3, .start_step4 {
	padding-left: initial !important;
	padding-right: 30px;
	background-position: right top !important;
}
.start_step2 {
	margin-left: initial !important;
	margin-right: 20px !important;
}
.start_step3 {
	margin-left: initial !important;
	margin-right: 40px !important;
}
.start_step4 {
	margin-left: initial !important;
	margin-right: 60px !important;
}
form .input {
	float: right !important;
}
#searchUsersTable th, .fht-table th {
	text-align: right !important;
}
.ui-dialog .ui-dialog-title {
	float: right !important;
}
.ui-dialog .ui-dialog-titlebar-close {
	right: initial !important;
	left: .3em;
}
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
	float: left !important;
}

/**** FIXME need to be moved to wicket-jquery-ui **************/
span.css-emoticon {
	transform: rotate(-90deg) !important;
}
.chat.dropdown-menu {
	left: initial !important;
    right: -50px !important;
	float: right !important;
}
