/*
 * 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.
 */
html, body {
	height: 100%;
	margin: 0;
	font-family: Arial, Helvetica, sans-serif;
}
#header {
	font-size: 28px;
	line-height: 40px;
	font-weight: bold;
	background-image: url(../public/themes/basic-theme/general/logo.png);
	background-repeat: no-repeat;
	padding-left: 150px;
}
#topLinks {
	position: absolute;
	top: 10px;
	right: 10px;
}

#topLinks span {
	padding-right: 5px;
	padding-left: 5px;
	border-right: 1px solid black;
}

#topLinks span:last-child {
	border-right: none;
}

#menu {
	background-color: #AFCBFB;
	margin-top: 10px;
}
.ui-menubar .ui-menu {
	width: 250px;
}
.ui-menu .ui-menu-item a {
	line-height: 1.2em !important;
	padding-bottom: 5px !important;
}
.menuName {
	font-weight: bold;
}
.menuDesc {
	font-size: smaller;
	line-height: 1em !important;
}

#busy_indicator {
	display: none;
	float: right;
	margin-top: 5px;
	z-index: 1000;
	width: 200px;
	font-weight: bold;
	text-align: center;
	font-size: 1em;
	color: #FF0000;
}

#chatPanel {
	position: fixed;
	z-index: 2000;
	bottom: 0px;
	right: 10px;
	width: 600px;
}
#chatPanel #chat {
	height: 10px;
	background-color: #F2FAFF;
}
#chatPanel #chat #controlBlock {
	background-color: #5294BB;
}
#chatPanel #chat #controlBlock:hover {
	background-color: #2779aa;
}
#chatPanel #chat #controlBlock #control {
	text-align: center;
	margin-left: 50%;
	margin-right: 50%;
}
#chatPanel #chat #messageArea .date {
    margin-right: 5px;
    font-style: italic;
    font-size: smaller;
}
#chatPanel #chat #messageArea .from {
	margin-left: 5px;
    margin-right: 5px;
	font-weight: bold;
}
#messageArea {
	height: 165px;
	overflow-y: auto;
}
#chatMessage .wysiwyg-editor {
	height: 70px;
	max-height: 70px;
}
.clickable {
	cursor: pointer;
}
.dragbox-content .tableWrapper {
	width: auto;
	height: 100px;
}
.dragbox-content .tableWrapper .adminListTable {
	max-width: none;
	min-width: 0;
}
.help.support h3 {
	margin-bottom: 5px;
}
.tableWrapper, .tableWrapperSmall {
	background-color: #FFFFFF;
	border: solid 1px #aacfe4;
	width: 536px;
	height: 100px;
	overflow-y: scroll;
}
.tableWrapper {
	height: 500px;
}

.formelementradiobox {
	margin-left: 100px;
}

.formelementradiobox input {
	margin: 0px 0px;
	border: none;
	width: 20px;
}

.formelementradiobox label {
	width: 260px;
	margin: 0px
}

.addLanguagePanel {
	display: block;
}

.addLanguagePanel select {
	padding: 0px 0px;
	border: solid 1px #aacfe4;
	width: 140px;
	font-size: 12px;
	margin-left: 2px;
}

.pagedEntityListPanel {
	margin-left: 2px;
	display: inline-block;
}

.searchForm {
	display: inline-block;
	vertical-align: top;
}

.pagedEntityListPanel select, .adminForm .pagedEntityListPanel select {
	padding: 0px 0px;
	border: solid 1px #aacfe4;
	width: 60px;
	font-size: 12px;
	display: inline;
	float: none;
}
.searchForm input[type="text"], .adminForm .searchForm input[type="text"] {
	width: 140px;
	float: none;
	display: inline-block;
}
.searchForm input[type="submit"], .adminForm .searchForm input[type="submit"] {
	width: auto;
	float: none;
	display: inline-block;
	border: 2px outset buttonface;
	padding: 1px 6px;
	font-size: 12px;
}
.pagedEntityListPanel input, .adminForm .pagedEntityListPanel input {
	font-size: 14px;
	padding: 0px 0px;
	border: solid 1px #aacfe4;
	width: 100px;
	height: 20px;
	margin: 2px 2px;
	display: inline;
	float: none;
}

.goto, .goto :link, .goto :hover {
	font-size: 14px;
	line-height: 14px;
	text-decoration: none;
	text-align: center;
	vertical-align: middle;
	min-width: 16px;
}

.goto.icon {
    display: inline-block;
    width: 16px;
    height: 16px;
    border: none;
    margin: 0px;
    padding: 0px;
    zoom: 1.2;
}

.ui-dialog {
	-moz-box-shadow: 3px 3px 4px #000;
	-webkit-box-shadow: 3px 3px 4px #000;
	/* For IE 8 */
	-ms-filter:
		"progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135, Color='#000000')";
	/* For IE 5.5 - 7 */
	filter: progid:DXImageTransform.Microsoft.Shadow(Strength=4, Direction=135,
		Color='#000000' );
	box-shadow: 3px 3px 4px #000;
}

.sort-icon {
	display: inline-block !important;
	text-indent: 0px !important;
}

.start_step1, .start_step2, .start_step3, .start_step4  {
	padding-left: 30px;
	background-position: left top;
	margin: 5px 0px 5px 0px; 
	background-size: contain;
	background-repeat: no-repeat;
	display: inline-block;
}
.start_step1 {
	background-image: url(../public/themes/basic-theme/dashboard/wizzard_button_1.png);
}
.start_step2 {
	background-image: url(../public/themes/basic-theme/dashboard/wizzard_button_2.png);
	margin-left: 20px;
}
.start_step3 {
	background-image: url(../public/themes/basic-theme/dashboard/wizzard_button_3.png);
	margin-left: 40px;
}
.start_step4 {
	background-image: url(../public/themes/basic-theme/dashboard/wizzard_button_4.png);
	margin-left: 60px;
}
.widget {
	width: 100%;
}
.widget td {
	min-width: 150px;
}
#contents .dragbox-content {
	min-height: 300px;
	max-height: 300px;
}
#feedcontainer {
	overflow: auto;
}
.recording {
	width: 100%;
	display: inline-block;
}
.recording .files {
	width: 250px;
	border: 1px solid #ccc;
}
.trash-toolbar {
	font-weight: bold;
	line-height: 20px;
	color: transparent;
}
.trash-toolbar-hover {
	color: inherit;
}
.recording .files .trees {
	min-height: 400px;
	max-height: 600px;
	overflow-x: hidden;
	overflow-y: auto;
}
.recording .files .sizes table, .recording .files .info table {
	width: 100%;
}
.recording .files .info input {
	width: 100%;
	padding-right: 5px;
	padding-left: 5px;
}
.recording .video .player {
	width: 100%;
	display: inline-block;
	box-shadow: 0 0 10px 1px rgba(74, 137, 151, 0.5);
}
.recording .video .player video {
	width: 100%;
}
.align-left {
	float: left;
}
.align-right {
	float: right;
}
.clear {
	clear: both;
}
.om-icon {
	background-repeat: no-repeat !important;
	background-position: 0 0 !important;
	width: 18px;
	height: 18px;
	border: none;
	margin-left: 2px;
	margin-top: 2px;
	display: inline-block !important;
}
.trees a.om-icon {
	width: auto;
}
.trees a.om-icon span {
	white-space: nowrap;
	padding-right: 20px;
	vertical-align: top;
}
.cross.om-icon {
	background-image: url(images/cross.png);
}
.tick.om-icon {
	background-image: url(images/tick.png);
}
.add.om-icon {
	background-image: url(images/add.png);
}
.new-email.om-icon {
	background-image: url(images/email_add.png);
}
.user.om-icon {
	background: url(images/user.png);
}
.refresh.om-icon {
	background: url(images/refresh.gif);
}
.trash.om-icon {
	background: url(images/trash.png);
}
.folder-create.om-icon {
	background: url(images/folder_add.png);
}
.recording.om-icon {
	padding-left: 18px;
	background-image: url(images/film.png);
}
.broken-recording.om-icon {
	padding-left: 18px;
	background-image: url(images/film_error.png);
}
.processing-recording.om-icon {
	padding-left: 18px;
	background-image: url(images/film_processing.png);
}
.my-recordings.om-icon {
	padding-left: 18px;
	background-image: url(images/house_link.png);
}
.public-recordings.om-icon {
	padding-left: 18px;
	background-image: url(images/world_link.png);
}
.tree-theme-windows span.tree-content {
	display: flex !important;
}
.recording.item {
	position: relative;
	vertical-align: top;
}
.recording.item .name {
	color: black;
	display: block;
	overflow: hidden;
	width: 230px;
}
.recording.item .errors {
	position: absolute;
	right: 0px;
	background-image: url(images/script_error.png);
	width: 16px;
	height: 16px;
	background-repeat: no-repeat;
	padding-right: 20px;
}
.recording.dialog.errors {
	width: 600px;
	height: 500px;
	font-size: small;
}
.recording.dialog.errors .alert {
	color: red;
}
.recording.dialog.errors .message {
	display: block;
	unicode-bidi: embed;
	font-family: monospace;
	white-space: pre;
	margin: 0;
}
.online.om-icon {
	background-image: url(images/bullet_green.png);
}
.offline.om-icon {
	background-image: url(images/bullet_red.png);
}
.error {
	color: red;
}
.message {
	margin: 50px;
	border: 1px solid black;
	padding: 15px;
	-webkit-border-radius: 8px;
	border-radius: 8px;
}
.ui-progressbar div { 
	text-align: center;
	padding-top: 7px;
	font-weight: bold;
}
table.messages {
	width: 100%;
	min-height: 500px;
}
table.messages td.side, table.messages td.main {
	vertical-align: top;
}
table.messages td.side.left {
	min-width: 150px;
	overflow-x: hidden;
}
table.messages td.side.right {
	min-width: 200px;
	overflow-x: hidden;
}
table.messages td.main {
	width: 100%;
}
.email {
	padding-left: 25px;
	background-repeat: no-repeat !important;
	background-position: 5px 3px !important;
	padding-top: 2px;
	display: block;
	text-align:left;
}
.email.new {
	background-image: url(images/email_add.png);
	font-weight: normal;
}
.email.new .ui-button-text, .email.newdir .ui-button-text {
	padding: 0;
}
.email.inbox {
	background-image: url(images/basket_put.png);
}
.email.sent {
	background-image: url(images/email_go.png);
}
.email.trash {
	background-image: url(images/email_delete.png);
}
.email.newdir {
	background-image: url(images/folder_add.png);
	font-weight: normal;
}
.email.folder {
	background-image: url(images/folder.png);
	font-weight: normal;
	position: relative;
}
.email.folder .delete {
	position:absolute;
	right: 2px;
	top: 2px;
	background-image: url(images/cross.png);
	font-weight: normal;
	padding: 0;
	display: inline-block;
	background-position: 0;
	width: 18px;
	height: 18px;
}
.messages.column.label {
	width: 20px;
	min-height: inherit;
}
input[type="text"].messages.text, .messages.text.to {
	width: 100%;
	max-height: 100px;
	overflow-y: auto;
}
textarea.messages.body {
	width: 100%;
	height: 300px;
}
select.messages.selector {
	width: 220px;
}
.info-text {
	background-image: url(images/information.png);
	background-repeat: no-repeat;
	background-position: left top;
	cursor: default;
	border: none;
	padding-left: 20px;
	font-style: italic;
}
.invisible-form-component {
	position: absolute;
	top: -9999px;
	width: 1px;
	height: 1px;
}
#messagesTable tr.unread {
	font-weight: bold;
}
.fht-tbody {
	background-color: white;
}
#searchUsersTable th, .fht-table th {
	font-weight: bold !important;
	text-align: left;
}
#ui-datepicker-div{
    z-index: 100 !important;
}
.room-list {
	border-collapse: collapse;
}
.room-row {
	background-color: rgb(248, 248, 248);
	border-bottom: 5px solid white;
}
.select2-results .select2-result .select2-result-label .user.external
, .select2-results .select2-result .select2-result-label .user.internal
, .select2-choices .select2-search-choice .user.external
, .select2-choices .select2-search-choice .user.internal {
	padding-left: 18px;
	background-repeat: no-repeat;
	background-position: 0px 2px;
}
.select2-results .select2-result .select2-result-label .user.external
, .select2-choices .select2-search-choice .user.external {
	background-image: url(images/user_go.png);
}
.select2-results .select2-result .select2-result-label .user.internal
, .select2-choices .select2-search-choice .user.internal {
	background-image: url(images/user.png);
}
.page.recording {
	padding-top: 40px;
}
.page.recording .video, .page.recording .info {
	display: inline-block;
	float: left;
	padding-left: 20px;
}
.page.recording .video {
	min-width: 400px;
}
.rooms.title {
	font-weight: bold;
	padding: 10px;
	padding-bottom: 0;
}
.rooms.desc {
	margin: 10px;
	max-width: 900px;
}
.user.info.panel legend {
	font-style: italic;
	text-align: right;
}
.user.info.panel fieldset table, .user.info.panel fieldset table textarea {
	width: 100%;
}
form .input {
	display: block;
	float: left;
	font-size: 14px;
	padding: 0px 0px;
	width: 280px;
	margin: 2px 2px;
}
.date.time.picker {
	font-size: 12px;
	white-space: nowrap;
}
