@import "compass/support";
@import "compass/utilities/general/hacks";

$gradient-support-threshold: $graceful-usage-threshold !default;
$svg-gradient-shim-threshold: $graceful-usage-threshold !default;
$border-image-support-threshold: $graceful-usage-threshold !default;
$owg-threshold: $graceful-usage-threshold !default;

// Compass assumes you will use the official gradient syntax,
// unless otherwise instructed.
$use-legacy-gradient-syntax: false !default;

// Create a linear gradient using standard official or legacy syntax.
// This function must be included in one of the following
// image module mixins to work properly.
@function linear-gradient($angle, $details...) {
  $legacy-syntax: $use-legacy-gradient-syntax;

  @if type-of($angle) != 'number' {
    $angle: compact($angle);
    $legacy-syntax: if(index($angle, 'to'), false, true);
  }

  @if $legacy-syntax {
    @return _linear-gradient_legacy($angle, $details...);
  } @else {
    @return _linear-gradient($angle, $details...);
  }
}

// These browsers support svg but not gradients
// so we can shim the gradient with an inline svg file.
$browsers-supporting-svg-but-not-gradients: (ie: "9", opera: "9.5-9.6");

// These browsers require the old webkit gradient syntax
$browsers-supporting-old-webkit-gradients: (android: ("2.1", "3"));

@mixin each-gradient-prefix($values) {
  @if prefixed(-svg, $values) {
    @include for-legacy-browsers($browsers-supporting-svg-but-not-gradients,
                                 $svg-gradient-shim-threshold)
    {
      @include with-prefix(-svg) {
        @content;
      }
    }
  }
  @if prefixed(-owg, $values) {
    @include for-legacy-browsers($browsers-supporting-old-webkit-gradients,
                                 $owg-threshold)
    {
      @include with-prefix(-owg) {
        @content;
      }
    }
  }
  @include with-each-prefix(css-gradients, $gradient-support-threshold) {
    @if $current-prefix {
      @if prefixed($current-prefix, $values) {
        @content;
      } @else if $debug-browser-support {
        /* There is not a value that needs to be prefixed with #{$current-prefix} in: #{$values} */
      }
    } @else {
      @content;
    }
  }
}

@mixin image-property($property, $values...) {
  @include each-gradient-prefix($values) {
    @if $current-prefix {
      #{$property}: prefix($current-prefix, $values);
    } @else {
      #{$property}: $values;
    }
    @content;
  }
}

// Background property support for vendor prefixing within values.
@mixin background($backgrounds...) {
  @include image-property(background, $backgrounds...);
}

// Set any number of background layers, along with a fallback.
// The final argument will be output separately, first, as a css2 fallback.
@mixin background-with-css2-fallback($backgrounds...) {
  @if length($backgrounds) > 1 or prefixed(-css2, $backgrounds) {
    background: -css2(nth($backgrounds, -1));
  }
  @include background($backgrounds...);
}


// Background image property support for vendor prefixing within values.
@mixin background-image($images...) {
  @include image-property(background-image, $images...) {
    @if $current-prefix == -svg {
      background-size: 100%;
    }
  }
}

// Emit a IE-Specific filters that renders a simple linear gradient.
// For use in IE 6 - 8. Best practice would have you apply this via a
// conditional IE stylesheet, but if you must, you should place this before
// any background-image properties that you have specified.
//
// For the `$orientation` parameter, you can pass `vertical` or `horizontal`.
@mixin filter-gradient(
  $start-color,
  $end-color,
  $orientation: vertical
) {
  @include for-legacy-browsers((ie: "8"), $gradient-support-threshold) {
    @include has-layout;
    $gradient-type: if($orientation == vertical, 0, 1);
    filter: progid:DXImageTransform.Microsoft.gradient(gradientType=#{$gradient-type}, startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}');
  }
}


// Border image property support for vendor prefixing properties and values.
@mixin border-image($value) {
  @include with-each-prefix(border-image, $border-image-support-threshold) {
    $border-prefix: $current-prefix;
    @include each-gradient-prefix($value) {
      @if $current-prefix and prefixed($current-prefix, $value) {
        $legacy-value: reject($value, fill);
        @include prefix-prop(border-image, prefix($current-prefix, $legacy-value), $prefix: $border-prefix);
      } @else {
        @include prefix-prop(border-image, $value, $prefix: $border-prefix);
      }
    }
  }
}

// List style image property support for vendor prefixing within values.
@mixin list-style-image($image) {
  @include image-property(list-style-image, $image);
}

// List style property support for vendor prefixing within values.
@mixin list-style($value) {
  @include image-property(list-style, $value);
}

// content property support for vendor prefixing within values.
@mixin content($value) {
  @include image-property(content, $value);
}
