<% # routing's not available yet, so we just guess based on presence
# of methods
def linkable?(model, action)
  action = action.to_s if RUBY_VERSION < "1.9"
  model.hobo_controller[subsite] && model.hobo_controller[subsite].public_instance_methods.include?(action)
end

%>
<!-- ====== Main Navigation ====== -->

<def tag="main-nav">
  <navigation class="main-nav" merge-attrs param="default">
    <nav-item href="#{base_url}/">Home</nav-item>
<% models.select { |m| linkable?(m, :index) }.each do |m| -%>
    <nav-item with="&<%= m.name %>"><ht key="<%= m.to_s.underscore %>.nav_item" count="100"><model-name-human count="100"/></ht></nav-item>
<% end -%>
  </navigation>
</def>



<% each_controller do -%>
<% next unless @controller < Hobo::Controller::Model %>
<!-- ====== <%= model.name %> Pages ====== -->
<%
new_link = linkable?(model, :new)
new_form = !new_link && linkable?(model, :create)
model_key = model.to_s.underscore
-%>

<def tag="index-page" for="<%= model.name %>">
  <page merge title="#{ht '<%= model_key %>.index.title', :default=>[model.model_name.human(:count=>100)] }">
    <body: class="index-page <%= model_class %>" param/>

    <content-header: param>
      <h2 param="heading">
        <ht key="<%= model_key %>.index.heading">
          <model-name-human model="&model"/>
        </ht>
      </h2>

      <p param="count" if>
        <ht key="<%= model_key %>.collection.count" count="&collection_count">
          <count summary/>
        </ht>
      </p>
    </content-header:>

    <content-body: param>
<% if new_link -%>
      <a action="new" to="&model" param="new-link">
        <ht key="<%= model_key %>.actions.new">New <%=model_name %></ht>
      </a>
<% end -%>

<% if view_hints.paginate? -%>
      <page-nav param="top-page-nav"/>

<% end -%>
<% if view_hints.sortable? -%>
      <sortable-collection param="collection"/>
<% else -%>
      <collection param/>
<% end -%>

<% if view_hints.paginate? -%>
      <page-nav param="bottom-page-nav"/>

<% end -%>

<% if new_form -%>
      <div param="new-form">
        <h3 param="new-form-heading">
          <ht key="<%= model_key %>.form.new.heading">New <%= model_name %></ht>
        </h3>
        <form with="&@invalid_record || new_for_current_user(<%= model %>)" param/>
      </div>

<% end -%>
    </content-body:>
  </page>
</def>


<def tag="new-page" for="<%= model.name %>">
  <page merge title="#{ht '<%= model_key %>.new.title', :default=>[' New <%= sq_escape(model_name) %>'] }">
    <body: class="new-page <%= model_class %>" param/>

    <content-header: param>
      <h2 param="heading">
        <ht key="<%= model_key %>.new.heading">
          New <%= model_name %>
        </ht>
      </h2>
    </content-header:>

    <content-body: param>
      <form param>
        <submit: label="#{ht '<%= model_key %>.actions.create', :default=>['Create <%= sq_escape(model_name) %>']}"/>
      </form>
    </content-body:>
  </page>
</def>


<%
back_link      = model.view_hints.parent
back_link_human_name = model.reflections[back_link.to_s] && model.reflections[back_link.to_s].klass unless back_link.blank?
back_link_human_name = back_link_human_name && back_link_human_name.model_name.human
boolean_fields = model.table_exists? ? (model.columns.select { |c| c.type == :boolean }.*.name - model.view_hints.inline_booleans) : []
creator        = model.creator_attribute
creator_link   = creator && model.reflections[creator.to_s] && linkable?(model.reflections[creator.to_s].klass, :show)
edit_link      = linkable?(model, :edit)
main_content   = model.primary_content_attribute
show_fields    = standard_fields(:belongs_to).*.to_s - [model.name_attribute, main_content, creator, back_link, *boolean_fields].*.to_s

is_user_model = model < Hobo::Model::UserBase

collection     = model.view_hints.primary_children
if collection
  collection_class = model.reflections[collection.to_s].klass
  owner            = model.reverse_reflection(collection)._?.name
  if owner
    add_link = collection && linkable?(collection_class, :"new_for_#{owner}")
    add_form = !add_link && linkable?(collection_class, :"create_for_#{owner}")
  end
end

unless model.view_hints.secondary_children.empty?
  aside_collections = model.view_hints.secondary_children.map { |c| [model.reflections[c.to_s], model.reverse_reflection(c)] }
end
-%>
<def tag="show-page" for="<%= model.name %>">
  <page merge title="#{ht '<%=model_key %>.show.title', :default=>['<%=sq_escape model_name %>'], :name => name(:no_wrapper => true) }"<%= ' without-aside' unless aside_collections %> >

    <body: class="show-page <%= model_class %>" param/>

    <content-header: param>
<% if back_link -%>
      <a:<%= back_link %> param="parent-link">&laquo; <ht key="<%= model_key %>.actions.back_to_parent" parent="<%= back_link_human_name %>" name="&this">Back to <name/></ht></a:<%= back_link %>>
<% end -%>
      <h2 param="heading">
        <ht key="<%= model_key %>.show.heading" name="#{name(:no_wrapper => true)}">
          <%= model_name %> <name/>
        </ht>
      </h2>
<% if boolean_fields -%>

      <record-flags fields="<%= boolean_fields * ', ' %>" param/>
<% end -%>
<% if creator_link -%>

      <a:<%= model.creator_attribute %> param="creator-link"/>
<% elsif creator -%>

      <view:get-creator param="creator-name"/>
<% end -%>
<% if edit_link -%>

      <a action="edit" if="&can_edit?" param="edit-link">
        <ht key="<%= model_key %>.actions.edit" name="#{name(:no_wrapper => true)}">
          Edit <%= model_name %>
        </ht>
      </a>
<% end -%>
    </content-header:>

    <content-body: param>
<% if main_content -%>
      <view:<%= main_content %> param="description" />
<% end -%>
<% if show_fields.any? -%>
      <field-list fields="<%= show_fields * ', ' %>" param/>
<% end -%>
<% if collection -%>
      <section param="collection-section">
        <h3 param="collection-heading">
          <ht key="<%= collection_class.to_s.underscore %>.collection.heading" count="&this.<%= collection.to_s %>.count" >
            <human-collection-name collection="<%= collection %>" your/>
          </ht>
        </h3>

<%   if sortable_collection?(collection) -%>
        <sortable-collection:<%= collection %> param="collection"/>
<%   else -%>
        <collection:<%= collection %> param/>
<%   end -%>
<%   if add_link -%>

        <a:<%= collection %> action="new" if="&can_create?(@<%= model.name.underscore %>.<%= collection %>)" param="new-link">
          <ht key="<%= collection_class.to_s.underscore %>.actions.new" count="1">
            New <%= collection_class.to_s.titleize %>
          </ht>
        </a:<%= collection %>>
<%   elsif add_form -%>

        <section param="add-to-collection" if="&can_create?(@<%= model.name.underscore %>.<%= collection %>)">
          <h3 param="add-form-heading">
            <ht key="<%= collection_class.to_s.underscore %>.collection.add_form_heading" count="1">
              Add <%= a_or_an collection_class.to_s.titleize %>
            </ht>
          </h3>
          <form with="&@<%= collection_class.name.underscore %> || new_for_current_user(@<%= model.name.underscore %>.<%= collection %>)" owner="<%= owner %>" without-cancel param>
            <field-list: skip="<%= owner %>"/>
            <submit: label="#{ht '<%= sq_escape collection_class.to_s.underscore %>.actions.add', :default=>['Add'] }"/>
          </form>
        </section>
<%   end -%>
      </section>
<% end -%>
    </content-body:>
<% if aside_collections -%>

    <aside: param>
<%   for refl, reverse_refl in aside_collections -%>
<%     if reverse_refl && linkable?(refl.klass, :"index_for_#{reverse_refl.name}") -%>
     <collection-preview:<%= refl.name %>.recent param="<%= refl.name %>-preview">
       <heading-content:><human-collection-name with="&this.origin" collection="<%= refl.name %>" your/></heading-content:>
     </collection-preview:<%= refl.name %>.recent>
<%     else -%>
      <section param="<%= refl.name %>-collection-section">
        <h3 param="<%= refl.name %>-collection-heading">
          <ht key="<%= refl.klass.to_s.underscore %>.collection.heading" count="&this.<%= refl.name.to_s %>.count" >
            <human-collection-name collection="<%= refl.name %>" your/>
          </ht>
        </h3>
        <collection:<%= refl.name %>  param="<%= refl.name %>-collection"/>
      </section>
<%     end -%>
<%   end -%>
    </aside:>
<% end -%>

  </page>
</def>


<%
name_attribute = model.name_attribute
-%>
<def tag="edit-page" for="<%= model.name %>">
  <page merge title="#{ht '<%= model_key %>.edit.title', :default=>['Edit <%= sq_escape model_name %>'], :name => name(:no_wrapper => true) }">

    <body: class="edit-page <%= model_class %>" param/>

    <content-header: param>
      <h2 param="heading">
        <ht key="<%= model_key %>.edit.heading" name="#{name(:no_wrapper => true)}">
          Edit <%= model_name %>
        </ht>
      </h2>
      <delete-button label="#{ht '<%= model_key %>.actions.delete', :default=>['Remove This <%= sq_escape model_name %>']}" param/>
    </content-header:>

    <content-body: param>
      <form param/>
    </content-body:>

  </page>
</def>

<% controller.owner_actions.each_pair do |owner, actions| -%>
<%
collection_name = model.reverse_reflection(owner.to_s).name.to_s
owner_model     = model.reflections[owner.to_s].klass
linkable_owner  = linkable?(owner_model, :show)
owner_tag       = linkable_owner ? "a" : "name"

owner_is_user = owner_model < Hobo::Model::UserBase

owner = model.reflections[owner.to_s].macro == :has_many ? owner.to_s.singularize : owner.to_s
-%>
<% if :index.in? actions -%>
<%
new_link = :new.in?(actions)
-%>
<def tag="index-for-<%= owner.dasherize %>-page" polymorphic/>
<def tag="index-for-<%= owner.dasherize %>-page" for="<%= model.name %>">
  <page merge title="#{ht '<%= model_key %>.index_for_owner.title', :count=>100, :default=>['<%= sq_escape(model_name(:plural)) %> for']} #{name :with => @<%= owner %>, :no_wrapper => true}">
    <body: class="index-for-owner-page <%= owner.dasherize %> <%= model_class %>" param/>
    <content-header: param>
<% if linkable_owner -%>
      <div param="back-to">
        <t key="hobo.actions.back">Back to</t> <a with="&@<%= owner %>"/>
      </div>
<% end -%>
      <h2 param="heading" if="&@owner">
        <ht key="<%= model_key %>.index_for_owner.heading" count="&@<%= owner %>.<%= collection_name %>.count">
          <human-collection-name with="&@<%= owner %>" collection="<%= collection_name %>" your/>
        </ht>
      </h2>
<% unless owner_is_user %>
      <h3 param="subheading">
        <ht key="<%= model_key %>.index_for_owner.subheading">
          For:
        </ht>
        <<%= owner_tag %> with="&@<%= owner %>"/>
      </h3>
<% end -%>
      <p param="count" if>
        <ht key="<%= model_key %>.collection.count" count="&collection_count">
          <count summary/>
        </ht>
      </p>
    </content-header:>

    <content-body: param>
<% if new_link -%>
      <a action="new" to="&@<%= owner %>.<%= collection_name %>" param="new-link">
        <ht key="<%= model_key %>.actions.new" >New <%=model_name %></ht>
      </a>

<% end -%>

      <page-nav param="top-page-nav"/>

      <collection param/>

      <page-nav param="bottom-page-nav"/>
    </content-body:>
  </page>
</def>
<% end -%>


<% if :new.in? actions -%>
<def tag="new-for-<%= owner.dasherize %>-page" polymorphic/>
<def tag="new-for-<%= owner.dasherize %>-page" for="<%= model.name %>">
  <page merge title="#{ht '<%=model_key %>.new_for_owner.title', :default=>['New <%= sq_escape model_name %> for']} #{name :with => @<%= owner %>}">
    <body: class="new-for-owner-page <% owner.dasherize %> <%= model_class %>" param/>

    <content-header: param>
      <h2 param="heading">
        <ht key="<%= model_key %>.new_for_owner.heading">
          New <%= collection_name.singularize.titleize %>
        </ht>
      </h2>
      <h3 param="subheading">
        <ht key="<%= model_key %>.new_for_owner.subheading">
          For:
        </ht>
        <<%= owner_tag %> with="&@<%= owner %>"/>
      </h3>
    </content-header:>

    <content-body: param>
      <form owner="<%= owner %>" method="post" param>
        <field-list: skip="<%= owner %>"/>
        <submit: label="#{ht '<%=model_key %>.actions.create', :default=>['Create <%= sq_escape model_name %>']}"/>
      </form>
    </content-body:>
  </page>
</def>
<% end -%>

<% end # of owner_actions.each_pair -%>

<% creator_names.each do |creator| -%>
<def tag="<%= creator.dasherize %>-page" polymorphic/>
<def tag="<%= creator.dasherize %>-page" for="<%= model.name %>">

  <page title="#{ht '<%=model_key %>.<%= creator.underscore %>.title', :default=>['<%= sq_escape creator.titleize %>']}" merge>

    <body: class="lifecycle-start-page <%= creator.dasherize %>-page" param/>

    <content-header: param>
      <h2 param="heading">
        <ht key="<%= model_key %>.<%= creator.underscore %>.heading">
          <%= creator.titleize %>
        </ht>
      </h2>
    </content-header:>

    <content-body: param>
      <<%= creator.dasherize %>-form param="form"/>
    </content-body:>

  </page>
</def>
<% end -%>

<% transition_names.each do |transition| -%>
<def tag="<%= transition.dasherize %>-page" polymorphic/>
<def tag="<%= transition.dasherize %>-page" for="<%= model.name %>">
  <page title="#{ht '<%=model_key %>.<%= transition.underscore %>.title', :default=>['<%= transition.titleize %>']}" merge>

    <body: class="lifecycle-transition-page <%= transition.dasherize -%>-page" param/>

    <content-header: param>
      <h2 param="heading">
        <ht key="<%= model_key %>.<%= transition.underscore %>.heading">
          <%= transition.titleize %>
        </ht>
      </h2>
    </content-header:>

    <content-body: param>
      <<%= transition.dasherize %>-form param="form"/>
    </content-body:>

  </page>
</def>

<% end -%>

<% end # of each_model do -%>