{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-#}
{% set hide_left_bar = not neighborhood.allow_browse %}
{% extends g.theme.master %}

{% block title %}{{neighborhood.name}} / {{title}}{% endblock %}

{% block extra_css %}
  {% if neighborhood.allow_browse %}
    <style type="text/css">
    #section .base .pad{
      background-color: inherit;
      border-radius: 0;
        -moz-border-radius: 0;
        -webkit-border-radius: 0;
      box-shadow: rgba(0,0,0, 0) 0 0 0;
        -moz-box-shadow:  rgba(0,0,0, 0) 0 0 0;
        -webkit-box-shadow:  rgba(0,0,0, 0) 0 0 0;
    }
    </style>
  {% endif %}
{% endblock %}

{% block inner_grid %}{% endblock %}
{% block header_classes %} colored{% endblock %}

{% block content %}
    {% if neighborhood.use_wiki_page_as_root and text %}
      {{ text }}
    {% endif %}
    {% if neighborhood.homepage %}
      {{neighborhood.homepage|safe}}
    {% endif %}
    {% if neighborhood.allow_browse %}
      {% if not projects %}
        <p>No projects found</p>
      {% else %}
      <div class="list">
        {{c.page_list.display(limit=limit, page=page, count=count)}}
        <div style="clear:both"></div>
        {% for project in projects %}
          {% do g.set_project(project) %}
          {% if h.has_access(project, 'read')() %}
            {{c.project_summary.display(value=project)}}
          {% endif %}
        {% endfor %}
        <div style="clear:both"></div>
        {{c.page_list.display(limit=limit, page=page, count=count)}}
      </div>
      {% endif %}
    {% endif %}
{% endblock %}
