/*
 * 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.
 */

* {
    margin: 0;
    padding: 0;
}
body {
    font-family: Arial, Tahoma, Helvetica;
    font-size: 10pt;
    font-weight: normal;
    color: #303942;
    background-color: #fff;
}
a {
    color: #303942;
    text-decoration: none;
}

.clear {
    clear: both;
}

button, .button {
    font-size: 9pt;
    color: #444444;
    cursor: pointer;
    text-align: center;
    position: relative;
    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1.00, #ededed), color-stop(1.00, #dddddd));
    border-width: 1px;
    border-style: solid;
    border-radius: 2px;
    padding: 5px 12px;
}
button:hover, .button:hover {
    color: #000000;
    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1.00, #f5f5f5), color-stop(1.00, #e2e2e2));
}
button.disabled, button[disabled=disabled], .button.disabled {
    cursor: not-allowed;
    color: #aaaaaa;
    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1.00, #f0f0f0), color-stop(1.00, #dddddd));
}

.panel {
    margin: 25px;
    padding-left: 25px;
    padding-right: 10px;
    border: 1px solid #a8a8a8;
    border-radius: 1px;
}
.title {
    clear: both;
    margin-top: 35px;
    font-size: 14pt;
    font-weight: bold;
}
.perex {
    margin-top: 10px;
}
.perex a {
    text-decoration: underline;
}
#help {
    display: none;
    margin-left: 40px;
    margin-top: 10px;
}
#help ul {
    margin-left: 20px;
}
#help p {
    margin-top: 5px;
}
#sizes {
    margin-top: 20px;
    margin-bottom: 15px;
}

/* columns */
#presetCustomizerTableWrapper {
    float: left;
    width: 100%;
}
#presetCustomizerTableColumn {
    margin-right: 145px;
}
#presetButtonsColumn {
    float: left;
    width: 145px;
    margin-left: -145px;
}

#presetCustomizerTable {
    width: 100%;
    table-layout: auto;
    border-collapse: collapse;
    border: 1px solid #e2e2e2;
    border-radius: 1px;
}
#presetCustomizerTable tr {
    height: 25px;
}
#presetCustomizerTable tr.active {
    background-color: #bbcee9;
}
#presetCustomizerTable tr:hover {
    background-color: #e4ecf7;
}
#presetCustomizerTable th {
    font-weight: bold;
    padding: 0 7px 5px 7px;
    text-align: left;
    vertical-align: bottom;
    background-color: #f5f5f5;
    border: 1px solid #e2e2e2;
}
#presetCustomizerTable td {
    position: relative;
    padding: 5px;
    border: 1px solid #e2e2e2;
}
#presetCustomizerTable input, select {
    font-size: 10pt;
    width: 100%;
}
#presetCustomizerTable select, #presetCustomizerTable input[type="checkbox"] {
    background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0.00, #f6f6f6), color-stop(1.00, #e1e1e1));
    border: 1px solid #a8a8a8;
    border-radius: 1px;
}
#presetCustomizerTable input {
    background-color: transparent;
    border: 0;
}
#presetCustomizerTable input[type="checkbox"] {
    width: 13px;
    height: 13px;
}
#presetCustomizerTable input:focus {
    outline: none;
}
#presetCustomizerTable input.error {
    color: red;
}
#presetCustomizerTable .toolbar {
    text-align: center;
}

#presetButtons {
    margin-left: 30px;
    margin-right: 20px;
}
#presetButtons button {
    display: block;
    min-width: 95px;
    margin-bottom: 5px;
}

.mainButtons {
    float: right;
    margin-top: 25px;
    margin-bottom: 10px;
}
.mainButtons button {
    margin-left: 5px;
}

#presetCustomizerCancel {
    margin-right: 0;
}

#resetWarningsPanel .perex {
    float: left;
    margin-top: 15px;
}
#resetWarningsPanel .mainButtons {
    margin-top: 10px;
}
