// Add percentage of white to a color
@function tint($color, $percent) {
    @return mix(white, $color, $percent);
}

// Add percentage of black to a color
@function shade($color, $percent) {
    @return mix(black, $color, $percent);
}

@function _linear-positions-parser($pos) {
    $type: type-of(nth($pos, 1));
    $spec: null;
    $degree: null;
    $side: null;
    $corner: null;
    $length: length($pos);
    // Parse Side and corner positions
    @if ($length > 1) {
        @if nth($pos, 1) == "to" { // Newer syntax
            $side: nth($pos, 2);

            @if $length == 2 { // eg. to top
                // Swap for backwards compatability
                $degree: _position-flipper(nth($pos, 2));
            }
            @else if $length == 3 { // eg. to top left
                $corner: nth($pos, 3);
            }
        }
        @else if $length == 2 { // Older syntax ("top left")
            $side: _position-flipper(nth($pos, 1));
            $corner: _position-flipper(nth($pos, 2));
        }

        @if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") {
            $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
        }
        @else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") {
            $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
        }
        @else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") {
            $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
        }
        @else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") {
            $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
        }
        $spec: to $side $corner;
    }
    @else if $length == 1 {
        // Swap for backwards compatability
        @if $type == string {
            $degree: $pos;
            $spec: to _position-flipper($pos);
        }
        @else {
            $degree: -270 - $pos; //rotate the gradient opposite from spec
            $spec: $pos;
        }
    }
    $degree: unquote($degree + ",");
    $spec:   unquote($spec + ",");
    @return $degree $spec;
}

@function _position-flipper($pos) {
    @return if($pos == left, right, null)
    if($pos == right, left, null)
    if($pos == top, bottom, null)
    if($pos == bottom, top, null);
}


@mixin placeholder {
    $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input";
    @each $placeholder in $placeholders {
        &:#{$placeholder}-placeholder {
            @content;
        }
    }
}

@mixin linear-gradient($pos, $G1, $G2: null,
                       $G3: null, $G4: null,
                       $G5: null, $G6: null,
                       $G7: null, $G8: null,
                       $G9: null, $G10: null,
                       $fallback: null) {
    // Detect what type of value exists in $pos
    $pos-type: type-of(nth($pos, 1));
    $pos-spec: null;
    $pos-degree: null;

    // If $pos is missing from mixin, reassign vars and add default position
    @if ($pos-type == color) or (nth($pos, 1) == "transparent")  {
        $G10: $G9; $G9: $G8; $G8: $G7; $G7: $G6; $G6: $G5;
        $G5: $G4; $G4: $G3; $G3: $G2; $G2: $G1; $G1: $pos;
        $pos: null;
    }

    @if $pos {
        $positions: _linear-positions-parser($pos);
        $pos-degree: nth($positions, 1);
        $pos-spec:   nth($positions, 2);
    }

    $full: $G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10;

    // Set $G1 as the default fallback color
    $fallback-color: nth($G1, 1);

    // If $fallback is a color use that color as the fallback color
    @if (type-of($fallback) == color) or ($fallback == "transparent") {
        $fallback-color: $fallback;
    }

    background-color: $fallback-color;
    background-image: -webkit-linear-gradient($pos-degree $full); // Safari 5.1+, Chrome
    background-image: unquote("linear-gradient(#{$pos-spec}#{$full})");
}
