module SexyForms
  def field(control, attribute, options = {})
    field_class = options.delete(:field_class)
    note        = options.delete(:note)
    required    = options.delete(:required)
    errors_for  = options.delete(:errors_for) || attribute
    options[:label] = Inflector.humanize(attribute) if options[:label].blank?
    
    errors = errors_on_attribute(errors_for)
    
    field_classes = ["field"]
    field_classes << "error" if errors.any?
    field_classes << options[:field_class] if options[:field_class]
    field_classes << control.to_s
    field_classes << "required" if required
    
    
    if options[:name]
      content = send("#{control}_field", options)
    else
      content = send("#{control}_control", attribute, options)
    end
    content += %(<p class="note">#{note}</p>) if note
    content += %(<p class="error">#{errors}</p>) if errors.any?
    
    tag :div, content, :class => field_classes.join(' ')
  end
  
  def errors_on_attribute(attribute)
    # @_obj comes automagically from merb
    [@_obj.errors[attribute.to_s]].flatten.join(' and ') rescue []    
  end
  
  # Pass more_html for cancel link (or whatever)
  def form_submit(string, options = {})
    %(<div class="field controls">)+
      (submit_button string, :class => "positive") +
      (options[:cancel] ? link_to("Cancel", options[:cancel], :class => "cancel") : '')+
    %(</div>)
  end
end

