#
# List of committees
#

_html do
  _base href: '..'
  _link rel: 'stylesheet', href: "stylesheets/app.css?#{cssmtime}"
  _whimsy_body(
    title: 'ASF PMC Listing',
    subtitle: 'List of all Top Level Projects',
    relatedtitle: 'More Useful Links',
    related: {
      "/committers/tools" => "Whimsy All Tools Listing",
      "https://svn.apache.org/repos/private/committers/" => "Checkout the private 'committers' repo for Committers",
      "https://github.com/apache/whimsy/blob/master/www#{ENV['SCRIPT_NAME']}" => "See This Source Code",
      "mailto:dev@whimsical.apache.org?subject=[FEEDBACK] members/index idea" => "Email Feedback To dev@whimsical"
    },
    helpblock: -> {
      _p do
        _ 'A full list of Apache PMCs; click on the name for a detail page about that PMC. '
        _ 'You can also view (Member-private) '
        _a href: '/roster/nonpmc/' do
          _span.glyphicon.glyphicon_lock :aria_hidden, class: 'text-primary', aria_label: 'ASF Members Private'
          _ 'Non-PMC Committees (Brand, Legal, etc.)'
        end
        _ ' and '
        _a href: '/roster/group/' do
          _span.glyphicon.glyphicon_lock :aria_hidden, class: 'text-primary', aria_label: 'ASF Members Private'
          _ 'Other Groups of various kinds (from LDAP or auth).'
        end
      end
      _p do
        _ 'Chair names in BOLD below are also ASF Members.  Click on column names in table to sort; jump to A-Z project listings here:'
        _br 
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ".each_char do |c|
          _a c, href: "committee/##{c}"
        end
        _ '(note: the links only work properly if the page is sorted by project name ascending)'
      end
    },
    breadcrumbs: {
      roster: '.',
      committee: 'committee/'
    }
  ) do

    _table.table.table_hover do
      _thead do
        _tr do
          _th.sorting_asc 'Name', data_sort: 'string-ins'
          _th 'Chair(s)', data_sort: 'string'
          _th 'Established', data_sort: 'string'
          _th 'Description', data_sort: 'string'
        end
      end
      _tbody do
        prev_letter=nil
        @committees.sort_by {|pmc| pmc.display_name.downcase}.each do |pmc|
          letter = pmc.display_name.upcase[0]
          if letter != prev_letter
            options = {id: letter}
          else
            options = {}
          end
          prev_letter = letter
          _tr_ options do
            _td do
              _a pmc.display_name, href: "committee/#{pmc.name}"
            end
  
            _td do
              pmc.chairs.each_with_index do |chair, index|
                _span ', ' unless index == 0
  
                if @members.include? chair[:id]
                  _b! {_a chair[:name], href: "committer/#{chair[:id]}"}
                else
                  _a chair[:name], href: "committer/#{chair[:id]}"
                end
              end
            end
  
            if not pmc.established
              _td ''
              _td.issue 'Not in committee-info.txt'
            else
              if pmc.established =~ /^(\d\d)\/(\d{4})(.*)$/
                est = "#{$2}-#{$1}#{$3}"
              else
                est = pmc.established
              end
              _td est
              _td pmc.description
            end
          end
        end
      end
    end
  end
  _script %{
    $(".table").stupidtable();
  }
end
