# All files in the 'lib' directory will be loaded
# before nanoc starts compiling.
require 'erb'
require 'active_support/inflector'
include Nanoc3::Helpers::LinkTo
include Nanoc3::Helpers::Capturing
include Nanoc3::Helpers::Rendering
include Nanoc3::Helpers::Breadcrumbs
include Nanoc3::Helpers::XMLSitemap

def body_class(item)
  classes = [""]
  classes += item[:classnames] || []
  classes << "demo" if item.identifier =~ /^\/examples/
  classes.join(" ")
end

def body_id(item)
  if item[:body_id]
    item[:body_id]
  elsif id = item.identifier.chop[1..-1]
    id.gsub(/\/|_/, "-")
  end
end

def body_attributes(item)
  {
    :id => body_id(item),
    :class => body_class(item)
  }
end

module Enumerable
  def sorted_and_grouped_by_name
    sort_by{|i| yield(i)}.group_by{|i| yield(i).sub(/^[^\w]/,"")[0..0].upcase}
  end
end

class Recycler
  attr_accessor :values
  attr_accessor :index
  def initialize *values
    self.values = values
    self.index = 0
  end
  def next
    values[index]
  ensure
    self.index += 1
    self.index = 0 if self.index >= self.values.size
  end
  def reset!
    self.index = 0
  end
end

def cycle(*args)
  yield Recycler.new *args
end

def default_path(item)
  item.reps.find{|r| r.name == :default}.path
end

def find(identifier)
  @items.find{|i| i.identifier == identifier}
end

def get_var(instance_var)
  instance_variable_defined?("@#{instance_var}") ? instance_variable_get("@#{instance_var}") : yield
end

def sidebar_item(item)
  if item.nil?
    nil
  elsif item[:sidebar]
    item
  else
    sidebar_item(item.parent)
  end
end

def sidebar_stylesheet(item)
  i = sidebar_item(item)
  i[:stylesheet] if i
end
  

def item_tree(item, options = {})
  crumb = item[:crumb] || item[:title]
  options[:heading_level] ||= 1 if options.fetch(:headings, true)
  child_html = ""
  if options.fetch(:depth,1) > 0
    child_opts = options.dup
    child_opts[:depth] -= 1 if child_opts.has_key?(:depth)
    child_opts[:heading_depth] -= 1 if child_opts.has_key?(:heading_depth)
    child_opts[:heading_level] += 1 if child_opts[:heading_level]
    child_opts.delete(:omit_self)
    item.children.sort_by{|c| c[:crumb] || c[:title]}.each do |child|
      next if child[:navigable] == false
      child_html << item_tree(child, child_opts)
    end
  else
    options.delete(:heading_level)
  end
  child_html = render("partials/sidebar/container", :contents => child_html) unless child_html.size == 0
  css_class = nil
  contents = unless options[:omit_self]
    item_opts = {
      :current_item => item,
      :selected => !!@item.identifier[item.identifier],
      :crumb => item[:crumb] || item[:title]
    }
    if options[:heading_level] && (options.fetch(:heading_depth, 1) > 0)
      render("partials/sidebar/heading",
        item_opts.merge(:heading => "h#{options[:heading_level]}")
      )
    else
      render("partials/sidebar/item", item_opts)
    end
  end
  %Q{#{contents}#{child_html}}
end

def tutorial_item(path)
  path = "" if path == :root
  @items.detect do |i|
    i.identifier == "/help/tutorials/#{path}"
  end
end

def documentation_item(path)
  path = "" if path == :root
  @items.detect do |i|
    i.identifier == "/help/documentation/#{path}"
  end
end


def compass_version
  v = Compass.version
  "#{v[:major]}.#{v[:minor]}#{"."+v[:state] if v[:state]}.#{v[:build] || v[:patch]}"
end

def long_compass_version
  require 'compass/commands'
  Compass::Commands::PrintVersion.long_output_string
end


def sprite_tutorial_links(index=false)
  string = <<-ERB
<% unless index %>
  * [Sprite Tutorial Index](/help/tutorials/spriting/)
<% end %>
<% Dir["./content/help/tutorials/spriting/**/*.markdown"].sort.each do |file| %>
  * [<%= File.basename(file, '.markdown').gsub('-', ' ').titleize %>](/help/tutorials/spriting/<%= File.basename(file, '.markdown') %>)
<% end %>
  ERB
  ::ERB.new(string).result(binding)
end
