- var methodSection, constructorSection, propertySection, eventSection;

-function renameMemberTitle(title, count)
  if title.indexOf("ethods") >= 0
    span Functions (#{count})
  else if title.indexOf("ropert") >= 0
    span Properties (#{count})   
  else
    span #{title} (#{count})

mixin article(obj, parents)
  if typeof obj === 'string'
    obj = list[obj]

  if (obj.private !== true)
    title = obj.id + (obj.type ? ' (' + obj.type + ')' : '')
    article.article(id=obj.path, data-title=title)
      if obj.type === 'section' || obj.type === 'namespace' || obj.type === 'class' || obj.type === 'mixin'

        if obj.stability
          mixin markdown(">" + obj.stability)

        if obj.description
          .section.description
            .memberContent
              mixin markdown(obj.description)

        collection = obj.children.filter(function(x){return x.type === 'namespace'});
        if collection.length
          .section.namespaces
            // 
              h3 Namespaces
              .memberContent
                mixin short_description_list(collection)

        collection = obj.children.filter(function(x){return x.type === 'mixin'});
        if collection.length
          .section.mixins
            // 
              h3 Mixins
              .memberContent
                mixin short_description_list(collection)

        if obj.type === 'class'

          if obj.superclass
            .section.superclass
              // h3 
                Superclass
                .memberContent
                  mixin link(obj.superclass)

          if obj.subclasses.length
            .section.subclasses
              // h3 
                Subclasses
                .memberContent
                  mixin links(obj.subclasses)

        if obj.included_mixins
          .section.mixins
            // h3 
              Includes
              .memberContent
                mixin links(obj.included_mixins)

        collection = obj.children.filter(function(x){return x.type === 'utility'})
        if collection.length
          .section.utilities
            // h3 
              Utilities
              .memberContent
                mixin links(collection)
      
      else

        .section.method
          .memberContent
            if obj.signatures
              div.title
                ul.signatures
                  -var loops = 0;
                  for sig in obj.signatures
                    li.signature
                      ul
                        li.signature-call!= signature(obj, sig, ["methodClicker"])
                          if sig.returns
                            li.signature-returns
                              ul.argument-types
                                for ret in sig.returns
                                  li.argument-type!= returnLink(obj, ret, [])
                      -if (loops == 0)
                        -loops = 1 // ensure that we only print ONE meta info UL per signature (some methods have multiple signatures)
                        ul.metaInfo
                            if obj.inheritedFrom
                              li
                                span.label.inheritedFrom
                                  | Inherited from: 
                                  != link(obj.inheritedFrom)
                            if obj.readonly
                              li
                                span.label.read-only Read-Only
                            if obj.chainable
                              li
                                span.label.chainable Chainable
                            if obj.internal
                              li
                                span.label.internal Internal
                            if obj.deprecated
                              li
                                span.label.deprecated
                                  | Deprecated
                                  if obj.deprecated.from
                                    | &nbsp; (since #{obj.deprecated.from})
                                    if obj.deprecated.off
                                      | &nbsp;and will be removed on #{obj.deprecated.off}
                            if obj.alias_of
                              li
                                span.label.alias.single
                                  | Aliased as: 
                                  != link(obj.alias_of)
                            else if obj.aliases.length
                              li
                                span.label.alias.multiple
                                  | Aliased as:
                                  ul.alias
                                    for alias in obj.aliases
                                      li
                                        mixin link(alias)

                            if obj.related_to
                              li
                                span.label.related-to
                                  | Related to
                                  mixin link(obj.related_to)  
                                    
            div.sideToggler

              div(id='ellipsis_#{obj.id}', class='ellipsis_description')
                mixin markdown(obj.short_description)

              h3(id='#{obj.id}', class='methodToggle methodClicker inactive')
                &nbsp;&nbsp;&nbsp;
              div.description

                mixin markdown(obj.description)

                if obj.bound && ~obj.bound.indexOf('#')
                  p.note.methodized
                    | This method can be called <em>either</em> as an 
                    != link(obj.bound, ['link-short'], 'instance method')
                    |  <em>or</em> as a generic method. If calling as generic, pass the instance in as the first argument.
                else if obj.bound && !~obj.bound.indexOf('#')
                  p.note.functionalized
                    | This method can be called <em>either</em> as an instance method <em>or</em> as a 
                    != link(obj.bound, ['link-short'], 'generic method')
                    |. If calling as generic, pass the instance in as the first argument.

                if obj.arguments
                  h4 Arguments
                  != argumentTable(obj.arguments, ["argument-list", "table", "table-striped", "table-bordered"])


                if obj.returns
                  h4 Returns
                  != returnTable(obj.returns, ["return-list", "table", "table-striped", "table-bordered"])

    //- children
    for child in obj.children.filter(function(x){return x.type === 'section'})
      mixin article(child, parents.concat(obj))
    for child in obj.children.filter(function(x){return x.type === 'utility'})
      mixin article(child, parents.concat(obj))

    for child in obj.children.filter(function(x){return x.type === 'constructor'})
      - if (!constructorSection)
        - constructorSection = true
        h3.sectionHeader Constructors
      mixin article(child, parents.concat(obj))

    for child in obj.children.filter(function(x){return x.type === 'namespace' || x.type === 'class' || x.type === 'mixin'})
      mixin article(child, parents.concat(obj))

    for child in obj.children.filter(function(x){return x.type === 'event'})
      - if (!eventSection)
        - eventSection = true
        h3.sectionHeader Events
      mixin article(child, parents.concat(obj), 'event')

    for child in obj.children.filter(function(x){return x.type === 'class method'})
      - if (!methodSection)
        - methodSection = true
        h3.sectionHeader Methods
      mixin article(child, parents.concat(obj))

    for child in obj.children.filter(function(x){return x.type === 'class property'})
      - if (!propertySection)
        - propertySection = true
        h3.sectionHeader Properties
      mixin article(child, parents.concat(obj))

    for child in obj.children.filter(function(x){return x.type === 'instance method'})
      mixin article(child, parents.concat(obj))
    for child in obj.children.filter(function(x){return x.type === 'instance property'})
      mixin article(child, parents.concat(obj))
    for child in obj.children.filter(function(x){return x.type === 'constant'})
      mixin article(child, parents.concat(obj))



mixin api()
  -pos = 0
  for obj in tree.children
    -if (obj.private !== false)
      .classContent
        .membersBackground
        div(class=' members pos#{pos}')
          div(class=' membersContent pos#{pos}')
              h1.memberHeader
                -var heading = obj.path
                span.name #{heading}
              
              -if (true || obj.filename.indexOf("index") < 0)
                ul(class='nav tabs pos#{pos}', data-tabs='tabs')
                  for selector, title in {'Events': ['event', 'events'], 'Constructors': ['constructor', 'constructors'], 'Class methods': ['class method', 'class_methods'], 'Class properties': ['class property', 'class_properties'], 'Instance methods': ['instance method', 'instance_methods'], 'Instance properties': ['instance property', 'instance_properties'], 'Constants': ['constant', 'constants']}
                    members = obj.children.filter(function(x){return x.type === selector[0]})
                      li(class="dropdown", data-dropdown="dropdown")
                        if members.length
                           a(href="\#", class="dropdown-toggle", data-toggle="dropdown")
                              != renameMemberTitle(title, members.length)
                              b.caret
                          ul.dropdown-menu
                            for m in members
                              li(data-id='#{m.id}', class='memberLink')
                                mixin link(m, [], true)
         -pos++
         -methodSection = constructorSection = propertySection = eventSection = false;
         mixin article(obj, [])


mixin short_description_list(collection)
  ul.method-details-list
    for obj in collection
      if typeof obj === 'string'
        obj = list[obj]
      li.method-description
        h4
          mixin link(obj)
        if obj.short_description
          mixin markdown(obj.short_description)

mixin link(obj, classes, short)
  l = link(obj, classes, short)
  != l

mixin links(collection)
  ul.method-list
    for obj in collection
      li
        mixin link(obj)
