/* ------------------------------------------------------------------------------
*
*  # Form related components
*
*  Overrides for bootstrap form related components
*
*  Version: 1.0
*  Latest update: May 25, 2015
*
* ---------------------------------------------------------------------------- */


/* Form controls
----------------------------------*/

// Normalize non-controls
// -------------------------

// Legend
legend {
    font-size: @font-size-small;
    padding-top: (@line-height-computed / 2);
    padding-bottom: (@line-height-computed / 2);
    text-transform: uppercase;

    // Remove top padding in first items
    fieldset:first-child & {
        &:first-child {
            padding-top: 0;
        }
    }

    // Control arrow
    .control-arrow {
        float: left;
        color: @text-muted;

        &:hover {
            color: @text-color;
        }
    }
}

// Label
label {
    margin-bottom: 6px;
    font-weight: 400;
}


// Normalize form controls
// -------------------------

// Multiple select
select[multiple],
select[size] {
    height: 200px;
    padding: @padding-base-vertical;

    // Option
    option {
        padding: @padding-base-vertical @padding-base-horizontal;
        border-radius: @input-border-radius;

        + option {
            margin-top: 1px;
        }
    }
}

// Focus for file, radio, and checkbox
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
    outline: 0;
}


// Common form controls
// -------------------------

.form-control {
    .box-shadow(none);

    // Remove outline and shadow on focus
    &:focus {
        outline: 0;
        .box-shadow(none);
    }
    &[class*=bg-]:focus {
        border-color: transparent;
    }

    // Placeholder in colored input
    &[class*=bg-] {
        .placeholder(@input-placeholder-light);
    }
}


// Form controls options
// -------------------------

// Rounded input
.input-rounded {
    border-radius: 100px;
}

// Roundless input
.input-roundless {
    border-radius: 0;
}

// Transparent input
.form-control-unstyled {
    padding: 0;
    border: 0;
    background-color: transparent;
}

// Remove inputs shadow in mobile browsers 
input[type="text"],
input[type="password"],
input[type="search"],
input[type="email"],
input[type="number"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="url"],
input[type="tel"],
textarea {
    -webkit-appearance: none;
}



/* Form components
----------------------------------*/

// Form groups
// -------------------------

.form-group {
    margin-bottom: @form-group-margin-bottom;
    position: relative;

    // Form group nesting
    .form-group {
        &:last-child {
            margin-bottom: 0;
        }
    }

    // Vertical spacing for stacked columns
    //
    // When nested form groups stack, add top margin for each column, except first.
    @media (max-width: @screen-sm-max) {
        div[class*="col-md-"]:not(.control-label) + div[class*="col-md-"] {
            margin-top: @form-group-margin-bottom;
        }
    }
    @media (max-width: @screen-md-max) {
        div[class*="col-lg-"]:not(.control-label) + div[class*="col-lg-"] {
            margin-top: @form-group-margin-bottom;
        }
    }
    @media (max-width: @screen-xs-max) {
        div[class*="col-sm-"]:not(.control-label) + div[class*="col-sm-"] {
            margin-top: @form-group-margin-bottom;
        }
    }
}


// Checkboxes and radios
// -------------------------

// Containers
.radio,
.checkbox {

    // Make them vertically centered depending on the base input height
    margin-top: ((@input-height-base - @line-height-computed) / 2);
    margin-bottom: ((@input-height-base - @line-height-computed) / 2);

    // Inner label element
    label {
        padding-left: 0;
        padding-right: (@checkbox-size + 10);
    }
}

// Checkbox and radio inputs
.radio input[type="radio"],
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
    margin-left: 0;
    right: 0;
}

// Siblings
.radio + .radio,
.checkbox + .checkbox {
    margin-top: 0;
}

// Radios and checkboxes on same line
.radio-inline,
.checkbox-inline {
    position: relative;
    padding-left: 0;
    padding-right: (@checkbox-size + @content-padding-small);
}


//
// Right position
//

// Radio
.radio-right {
    &.radio-inline,
    label {
        padding-right: 0;
        padding-left: (@checkbox-size + @content-padding-small);
    }

    input[type="radio"] {
        right: auto;
        left: 0;
    }
}

// Checkbox
.checkbox-right:extend(.radio-right all) {
    &.checkbox-inline,
    label {
        &:extend(.radio-right.radio-inline);
    }
    input[type="checkbox"] {
        &:extend(.radio-right input[type="radio"]);
    }
}

// Inline siblings
.radio-inline + .radio-inline,
.checkbox-inline + .checkbox-inline {
    margin-left: 0;
    margin-right: @content-padding-base;
}

// Disabled state
.radio,
.checkbox {
    &,
    &-inline {
        &.disabled,
        fieldset[disabled] & {
            color: @gray-light;
        }
    }
}



/* Form control sizing
----------------------------------*/

// The `.form-group-* form-control` variations are sadly duplicated to avoid the
// issue documented in https://github.com/twbs/bootstrap/issues/15074.

// XLarge
.input-xlg {
    .input-size(@input-height-xlarge; @padding-xlarge-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);
}
.form-group-xlg {
    .form-control {
        .input-size(@input-height-large + 4; @padding-large-vertical + 2; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);
    }
    .form-control-static {
        height: @input-height-large;
        padding: @padding-large-vertical @padding-large-horizontal;
        font-size: @font-size-large;
        line-height: @line-height-large;
    }
}

// Small
.input-sm {
    font-size: @font-size-base;
    line-height: @line-height-base;
}
.form-group-sm {
    .form-control {
        font-size: @font-size-base;
        line-height: @line-height-base;
    }
    .form-control-static {
        font-size: @font-size-base;
        line-height: @line-height-base;
    }
}

// Mini
.input-xs {
    .input-size(@input-height-mini; @padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);
}
.form-group-xs {
    .form-control {
        .input-size(@input-height-mini; @padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);
    }
    .form-control-static {
        height: @input-height-mini;
        padding: @padding-xs-vertical @padding-xs-horizontal;
        font-size: @font-size-small;
        line-height: @line-height-small;
    }
}



/* Form helpers
----------------------------------*/

// Form control feedback states
// -------------------------

// Default right icon position
.has-feedback {

    // Ensure icons don't overlap text
    .form-control {
        padding-right: @padding-base-horizontal;
        padding-left: @input-height-base;

        &.input-xlg {
            padding-left: @input-height-xlarge;
        }

        &.input-lg {
            padding-left: @input-height-large;
        }

        &.input-sm {
            padding-left: @input-height-small;
        }

        &.input-xs {
            padding-left: @input-height-mini;
        }
    }
}

// Feedback icon
.form-control-feedback {
    width: (@input-height-base + 2);
    color: @input-color;
    right: auto;
    left: 0;

    input[class*=bg-] + & {
        color: #fff;
    }
}

// Left icon position
.has-feedback-left {
    .form-control {
        padding-left: @padding-base-horizontal;
        padding-right: @input-height-base;

        &.input-xlg {
            padding-left: @padding-xlarge-vertical;
            padding-right: @input-height-xlarge;
        }

        &.input-lg {
            padding-left: @padding-large-horizontal;
            padding-right: @input-height-large;
        }

        &.input-sm {
            padding-left: @padding-small-horizontal;
            padding-right: @input-height-small;
        }

        &.input-xs {
            padding-left: @padding-xs-horizontal;
            padding-right: @input-height-mini;
        }
    }
    .form-control-feedback {
        left: auto;
        right: 0;
    }
}


//
// Sizing
//

// XLarge
.input-xlg + .form-control-feedback,
.form-group-xlg > .form-control-feedback {
    width: @input-height-xlarge + 2;
    height: @input-height-xlarge;
    line-height: @input-height-xlarge;
}

// Large
.input-lg + .form-control-feedback,
.form-group-lg > .form-control-feedback {
    width: @input-height-large + 2;
}

// Small
.input-sm + .form-control-feedback,
.form-group-sm > .form-control-feedback {
    width: @input-height-small + 2;
}

// Mini
.input-xs + .form-control-feedback,
.form-group-xs > .form-control-feedback {
    width: @input-height-mini + 2;
    height: @input-height-mini;
    line-height: @input-height-mini;
}


// Help text
// -------------------------

// Block helpers
.help-block {
    color: @text-muted;
    font-size: @font-size-small;
    margin-top: @padding-base-vertical;
    margin-bottom: @padding-base-vertical;
}

// Inline helpers
.help-inline {
    display: inline-block;
    color: @text-muted;
    font-size: @font-size-small;
    margin-top: @padding-base-vertical;
    margin-bottom: @padding-base-vertical;

    // Remove gutter if inside column
    .form-horizontal .form-group > div[class*="col-"] + & {
        margin-left: (@grid-gutter-width / 2);
        margin-right: (@grid-gutter-width / 2);
    }

    // Inline help works only on large screens
    @media (min-width: @screen-md) {
        display: inline-block;
        margin-top: (@padding-base-vertical + 1); // vertical padding + 1px border
        vertical-align: top;

        // Inline label helper
        &.label {
            margin-top: (@padding-base-vertical + 2); // vertical padding + 2px height difference
        }

        // Inline text helper
        &:not(.label) {
            color: @text-muted
        }

        // In large group
        .form-group-lg & {
            margin-top: 10px;

            &.label {
                margin-top: 11px;
            }
        }

        // In small group
        .form-group-sm & {
            margin-top: 7px;

            &.label {
                margin-top: 8px;
            }
        }

        // In mini group
        .form-group-xs & {
            margin-top: 6px;

            &.label {
                margin-top: 7px;
            }
        }
    }
}



/* Form layouts
----------------------------------*/

// Inline forms
// -------------------------

.form-inline {
    @media (min-width: @screen-sm-min) {

        // Inline-block all the things for "inline"
        .form-group {
            & + .form-group {
                margin-left: 0;
                margin-right: @content-padding-base;
            }

            // Label setup
            > label {
                margin-right: 0;
                margin-left: @element-horizontal-spacing;
                position: relative;
                top: 1px;
            }
        }
    }
}


// Horizontal forms
// -------------------------

.form-horizontal {

    // Make form groups behave like rows
    .form-group {

        // Nesting
        .form-group {
            margin-left: 0;
            margin-right: 0;
        }
    }

    // Control label
    @media (min-width: @screen-sm-min) {
        .control-label {
            padding-bottom: 6px;
            padding-top: 0;

            &:not(.text-left) {
                text-align: right;
            }
        }
    }

    // Bottom padding for stacked control labels
    .control-label {
        @media (min-width: @screen-xs) {
            &[class*=col-xs-] {
                padding-top: (@padding-base-vertical + 1);
            }
        }

        @media (min-width: @screen-md) {
            &[class*=col-md-] {
                padding-top: (@padding-base-vertical + 1);
            }
        }

        @media (min-width: @screen-sm) {
            &[class*=col-sm-] {
                padding-top: (@padding-base-vertical + 1);
            }
        }

        @media (min-width: @screen-lg) {
            &[class*=col-lg-] {
                padding-top: (@padding-base-vertical + 1);
            }
        }
    }

    // Validation state icons
    .has-feedback {
        .form-control-feedback {
            right: auto;
            left: (@grid-gutter-width / 2); // If inside grid columns, we need to count grid gutter
        }

        // If outside grid columns
        > .form-control-feedback {
            left: 0;
        }
    }
    .has-feedback-left {
        .form-control-feedback {
            left: auto;
            right: (@grid-gutter-width / 2); // If inside grid columns, we need to count grid gutter
        }

        // If outside grid columns
        > .form-control-feedback {
            right: 0;
        }
    }


    //
    // Form group sizes
    //

    // XLarge
    .form-group-xlg {
        @media (min-width: @screen-sm-min) {
            .control-label {
                font-size: @font-size-large;
                padding-top: (@padding-xlarge-vertical + 1);
            }
        }
    }

    // Large
    .form-group-lg {
        @media (min-width: @screen-sm-min) {
            .control-label {
                font-size: @font-size-large;
                padding-top: (@padding-large-vertical + 1);
            }
        }
    }

    // Small
    .form-group-sm {
        @media (min-width: @screen-sm-min) {
            .control-label {
                padding-top: (@padding-small-vertical + 1);
            }
        }
    }

    // Mini
    .form-group-xs {
        @media (min-width: @screen-sm-min) {
            .control-label {
                padding-top: (@padding-xs-vertical + 1);
            }
        }
    }
}
