/*

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.

*/

#content #analysis-holder
{
  background-image: url( ../../img/div.gif );
  background-position: 50% 0;
  background-repeat: repeat-y;
}

#content #analysis #field-analysis
{
  margin-bottom: 0;
}

#content #analysis #field-analysis .content
{
  padding-bottom: 0;
}

#content #analysis .settings-holder
{
  clear: both;
  padding-top: 15px;
}

#content #analysis .settings
{
  background-color: #fff;
  border-top: 1px solid #fafafa;
  border-bottom: 1px solid #fafafa;
  padding-top: 10px;
  padding-bottom: 10px;
}

#content #analysis .settings select.loader
{
  background-position: 3px 50%;
  padding-left: 21px;
}

#content #analysis .settings select optgroup
{
  font-style: normal;
  padding: 5px;
}

#content #analysis .settings select option
{
  padding-left: 10px;
}

#content #analysis .settings #tor_schema
{
  background-image: url( ../../img/ico/question-white.png );
  background-position: 0 50%;
  color: #c0c0c0;
  margin-left: 5px;
  padding-left: 21px;
}

#content #analysis .settings #tor_schema:hover
{
  background-image: url( ../../img/ico/question.png );
}

#content #analysis .settings #tor_schema span
{
//  display: none;
}

#content #analysis .settings #tor_schema:hover span
{
  display: inline;
}

#content #analysis .settings .buttons
{
  float: right;
  width: 47%;
}

#content #analysis .settings button
{
  float: right;
}

#content #analysis .settings button span
{
  background-image: url( ../../img/ico/funnel.png );
}

#content #analysis .settings .verbose_output
{
  float: left;
  width: auto;
}

#content #analysis .settings .verbose_output a
{
  background-image: url( ../../img/ico/ui-check-box-uncheck.png );
  background-position: 0 50%;
  color: #999;
  display: block;
  padding-left: 21px;
}

#content #analysis .settings .verbose_output.active a
{
  background-image: url( ../../img/ico/ui-check-box.png );
}

#content #analysis .index label,
#content #analysis .query label
{
  display: block;
}

#content #analysis .index textarea,
#content #analysis .query textarea
{
  display: block;
  width: 100%;
}

#content #analysis .index
{
  float: left;
  margin-right: 0.5%;
  min-width: 47%;
  max-width: 99%;
}

#content #analysis .query
{
  float: right;
  margin-left: 0.5%;
  min-width: 47%;
  max-width: 99%;
}

#content #analysis .analysis-error
{
  background-color: #f00;
  background-image: url( ../../img/ico/construction.png );
  background-position: 10px 50%;
  color: #fff;
  font-weight: bold;
  margin-bottom: 20px;
  padding: 10px;
  padding-left: 35px;
}

#content #analysis .analysis-error .head a
{
  color: #fff;
  cursor: auto;
}

#content #analysis #analysis-result
{
  overflow: auto;
}

#content #analysis #analysis-result .index,
#content #analysis #analysis-result .query
{
  background-color: #fff;
  padding-top: 20px;
}

#content #analysis #analysis-result table
{
  border-collapse: collapse;
}

#content #analysis #analysis-result td
{
  vertical-align: top;
  white-space: nowrap;
}

#content #analysis #analysis-result td.part.analyzer div,
#content #analysis #analysis-result td.part.spacer .holder,
#content #analysis #analysis-result td td td
{
  padding-top: 1px;
  padding-bottom: 1px;
}

#content #analysis #analysis-result.verbose_output td.legend
{
  display: table-cell;
}

#content #analysis #analysis-result.verbose_output td.data tr.verbose_output
{
  display: table-row;
}

#content #analysis #analysis-result .match
{
  background-color: #e9eff7;
  background-color: #f2f2ff;
}

#content #analysis #analysis-result td.part
{
  padding-bottom: 10px;
}

#content #analysis #analysis-result td.part.analyzer div
{
  border-right: 1px solid #f0f0f0;
  padding-right: 10px;
}

#content #analysis #analysis-result td.part.analyzer abbr
{
  color: #c0c0c0;
}

#content #analysis #analysis-result td.part.legend .holder,
#content #analysis #analysis-result td.part.data .holder
{
  padding-left: 10px;
  padding-right: 10px;
  border-right: 1px solid #c0c0c0;
}

#content #analysis #analysis-result td.part.legend td
{
  color: #c0c0c0;
}

#content #analysis #analysis-result td.part.legend .holder
{
  border-right-color: #f0f0f0;
}

#content #analysis #analysis-result td.part.data:last-child .holder
{
  padding-right: 0;
  border-right: 0;
}

#content #analysis #analysis-result td.details 
{
  padding-left: 10px;
  padding-right: 10px;
  border-left: 1px solid #f0f0f0;
  border-right: 1px solid #f0f0f0;
}

#content #analysis #analysis-result td.details:first-child
{
  padding-left: 0;
  border-left: 0;
}

#content #analysis #analysis-result td.details:last-child
{
  padding-right: 0;
  border-right: 0;
}

#content #analysis #analysis-result td.details tr.empty td
{
  color: #f0f0f0;
}

#content #analysis #analysis-result td.details tr.raw_bytes td
{
  letter-spacing: -1px;
}

#content #analysis #analysis-result .part table table td
{
  border-top: 1px solid #f0f0f0;
}

#content #analysis #analysis-result .part table table tr:first-child td
{
  border-top: 0;
}

#content #analysis #field-analysis h2 { background-image: url( ../../img/ico/receipt.png ); }
#content #analysis .analysis-result h2 { background-image: url( ../../img/ico/receipt-invoice.png ); }
