require 'rubygems'
require 'johnson'
require 'json'

module Isotope
  @@_template_cache = {}
  
  @@cache_templates = true
  
  def cache_templates
    @@cache_templates
  end
  
  def cache_templates=(value)
    if !value
      @@_template_cache.clear
    end
    
    @@cache_templates = value
  end
  
  def self.render_partial(view_file, options = {})
    if options[:collection] && options[:collection].kind_of?(Enumerable)
      return render_partial_collection(view_file, options)
    end
    
    isotope_file_path = File.join(File.dirname(__FILE__), "isotope.js")
    
    view_file_content = template_file_content(view_file)

    script = "
      Johnson.runtime.load('#{isotope_file_path}');
      Isotope(#{view_file_content.to_json}, #{options[:locals].to_json});
    "
    
    # puts script

    output = Johnson.evaluate(script)
    
    output
  end
  
  def self.render_partial_collection(view_file, options = {})
    s = []
    
    options.delete(:collection).each { |item|
      item_options = options.dup
      item_options[:locals] ||= {}
      item_options[:locals][options[:local_name] || :item] = item

      s << render_partial(view_file, item_options)
    }
    
    s = s.join(options[:delimeter] || "")
    
    s
  end

  def self.render_template(view_file, options = {})
    options[:id] = "template" unless options[:id]

    view_file_content = template_file_content(view_file)
    template_string = "<script type=\"text/x-isotope\" id=\"#{options[:id]}\">#{view_file_content}</script>"

    template_string
  end
  
  def self.template_file_content(view_file)
    if @@cache_templates
      @@_template_cache[view_file] ||= IO.read(view_file)
    else
      IO.read(view_file)
    end
  end
end