/*

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 #query
{
  background-image: url( ../../img/div.gif );
  background-position: 22% 0;
  background-repeat: repeat-y;
}

#content #query #form
{
  float: left;
  width: 21%;
}

#content #query #form label
{
  cursor: pointer;
  display: block;
  margin-top: 5px;
}

#content #query #form input,
#content #query #form select,
#content #query #form textarea
{
  margin-bottom: 2px;
  width: 100%;
}

#content #query #form input,
#content #query #form textarea
{
  width: 98%;
}

#content #query #form .multiple input
{
  float: left;
  width: 80%
}

#content #query #form .multiple .buttons
{
  float: right;
  width: 16%;
}


#content #query #form .multiple a
{
  background-position: 50% 50%;
  display: block;
  height: 25px;
  width: 49%;
}

#content #query #form .multiple a.add
{
  background-image: url( ../../img/ico/plus-button.png );
  float: right;
}

#content #query #form .multiple a.rem
{
  background-image: url( ../../img/ico/minus-button.png );
  float: left;
}

#content #query #form #start
{
  float: left;
  width: 45%;
}

#content #query #form #rows
{
  float: right;
  width: 45%;
}

#content #query #form .checkbox input
{
  margin-bottom: 0;
  width: auto;
}

#content #query #form fieldset,
#content #query #form .optional.expanded
{
  border: 1px solid #fff;
  border-top: 1px solid #c0c0c0;
  margin-bottom: 5px;
}

#content #query #form fieldset.common
{
  margin-top: 10px;
}

#content #query #form fieldset legend,
#content #query #form .optional.expanded legend
{
  display: block;
  margin-left: 10px;
  padding: 0px 5px;
}

#content #query #form fieldset legend label
{
  margin-top: 0;
}

#content #query #form fieldset .fieldset
{
  border-bottom: 1px solid #f0f0f0;
  margin-bottom: 5px;
  padding-bottom: 10px;
}

#content #query #form .optional
{
  border: 0;
}

#content #query #form .optional legend
{
  margin-left: 0;
  padding-left: 0;
}

#content #query #form .optional.expanded .fieldset
{
  display: block;
}

#content #query #result
{
  float: right;
  width: 77%;
}

#content #query #result #response
{
}
