@import "compass/css3/images";
@import "compass/css3/background-size";

// Set the color of your columns
$grid-background-column-color     : rgba(100, 100, 225, 0.25)   !default;
// Set the color of your gutters
$grid-background-gutter-color     : rgba(0, 0, 0, 0)            !default;

// Set the total number of columns in your grid
$grid-background-total-columns    : 24                          !default;
// Set the width of your columns
$grid-background-column-width     : 30px                        !default;
// Set the width of your gutters
$grid-background-gutter-width     : 10px                        !default;
// Set the offset, if your columns are padded in from the container edge
$grid-background-offset           : 0px                         !default;

// Set the color of your baseline
$grid-background-baseline-color   : rgba(0, 0, 0, 0.5)          !default;
// Set the height of your baseline grid
$grid-background-baseline-height  : 1.5em                       !default;

// toggle your columns grids on and off
$show-column-grid-backgrounds     : true                        !default;
// toggle your vertical grids on and off
$show-baseline-grid-backgrounds   : true                        !default;
// toggle all your grids on and off
$show-grid-backgrounds            : true                        !default;

// optionally force your grid-image to remain fluid
// no matter what units you used to declared your grid.
$grid-background-force-fluid      : false                       !default;


// Create the gradient needed for baseline grids
@function get-baseline-gradient(
  $color : $grid-background-baseline-color
) {
  $gradient: linear-gradient(bottom, $color 5%, rgba($color,0) 5%);
  @return $gradient;
}

// Create the color-stops needed for horizontal grids
@function build-grid-background(
  $total          : $grid-background-total-columns,
  $column         : $grid-background-column-width,
  $gutter         : $grid-background-gutter-width,
  $offset         : $grid-background-offset,
  $column-color   : $grid-background-column-color,
  $gutter-color   : $grid-background-gutter-color
) {
  $grid: compact();
  $grid: append($grid, $gutter-color $offset, comma);
  @for $i from 0 to $total {

    // $a represents the start of this column, initially equal to the offset
    $a: $offset;
    @if $i > 0 { $a: $a + (($column + $gutter) * $i); }

    // $g represents the start of this gutter, equal to $a plus one column-width
    $g: $a + $column;

    // $z represents the end of a gutter, equal to $g plus one gutter-width
    $z: $g + $gutter;

    @if (unit($a) == "%") and ($i == ($total - 1)) {
      $z: 100%;
    }

    // and we add this column/gutter pair to our grid
    $grid: join($grid, ($column-color $a, $column-color $g, $gutter-color $g, $gutter-color $z));
  }

  @return $grid;
}

// Return the gradient needed for horizontal grids
@function get-column-gradient(
  $total          : $grid-background-total-columns,
  $column         : $grid-background-column-width,
  $gutter         : $grid-background-gutter-width,
  $offset         : $grid-background-offset,
  $column-color   : $grid-background-column-color,
  $gutter-color   : $grid-background-gutter-color,
  $force-fluid    : $grid-background-force-fluid
) {
  $grid: unquote("");

  // don't force fluid grids when they are already fluid.
  @if unit($column) == "%" { $force-fluid: false; }

  @if $force-fluid {
    $grid: get-column-fluid-grid($total,$column,$gutter,$offset,$column-color,$gutter-color);
  } @else {
    $grid: build-grid-background($total,$column,$gutter,$offset,$column-color,$gutter-color);
  }

  // return the horizontal grid as a gradient
  $gradient: linear-gradient(left, $grid);
  @return $gradient;
}

// Convert a grid from fixed units into percentages.
@function get-column-fluid-grid(
  $total          : $grid-background-total-columns,
  $column         : $grid-background-column-width,
  $gutter         : $grid-background-gutter-width,
  $offset         : $grid-background-offset,
  $column-color   : $grid-background-column-color,
  $gutter-color   : $grid-background-gutter-color
) {
  $context: ($column * $total) + ($gutter * ($total - 1) + ($offset * 2));
  $offset: $offset / $context * 100%;
  $column: $column / $context * 100%;
  $gutter: $gutter / $context * 100%;

  // return the horizontal grid as a set of color-stops
  $grid: build-grid-background($total,$column,$gutter,$offset,$column-color,$gutter-color);
  @return $grid;
}


// Add just the baseline grid to an element's background
@mixin baseline-grid-background(
  $baseline : $grid-background-baseline-height,
  $color    : $grid-background-baseline-color
) {
  @if $show-grid-backgrounds and $show-baseline-grid-backgrounds {
    @include background-image(get-baseline-gradient($color));
    @include background-size(100% $baseline);
    background-position: left top;
  }
}

// Add just the horizontal grid to an element's background
@mixin column-grid-background(
  $total          : $grid-background-total-columns,
  $column         : $grid-background-column-width,
  $gutter         : $grid-background-gutter-width,
  $offset         : $grid-background-offset,
  $column-color   : $grid-background-column-color,
  $gutter-color   : $grid-background-gutter-color,
  $force-fluid    : $grid-background-force-fluid
) {
  @if $show-grid-backgrounds and $show-column-grid-backgrounds {
    @include background-image(
      get-column-gradient($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid)
    );
    background-position: left top;
  }
}

// Add both horizontal and baseline grids to an element's background
@mixin grid-background(
  $total          : $grid-background-total-columns,
  $column         : $grid-background-column-width,
  $gutter         : $grid-background-gutter-width,
  $baseline       : $grid-background-baseline-height,
  $offset         : $grid-background-offset,
  $column-color   : $grid-background-column-color,
  $gutter-color   : $grid-background-gutter-color,
  $baseline-color : $grid-background-baseline-color,
  $force-fluid    : $grid-background-force-fluid
) {
  @if $show-grid-backgrounds {
    @if $show-baseline-grid-backgrounds and $show-column-grid-backgrounds {
      @include background-image(
        get-baseline-gradient($baseline-color),
        get-column-gradient($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid)
      );
      @include background-size(100% $baseline, auto);
      background-position: left top;
    } @else {
      @include baseline-grid-background($baseline, $baseline-color);
      @include column-grid-background($total,$column,$gutter,$offset,$column-color,$gutter-color, $force-fluid);
    }
  }
}
